Django跨应用使用@property遇阻:无法在钱包应用Admin调用用户属性
问题解决:Django跨应用Admin内联调用@property属性
问题场景
在Django的两个应用(user和wallet)中,尝试在wallet应用的Admin内联中调用user模型定义的full_name属性时失败,相关代码如下:
user.models.py
class user(models.Model): name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) wallet = models.ForeignKey(Wallet, on_delete=models.CASCADE) @property def full_name(self) return self.name + self.last_name
wallet.models.py
class wallet(models.Model): amount = models.IntegerField()
wallet.admin.py
class UserrInline(admin.TabularInline): list_display = ['full_name'] #无法在用户应用中使用该属性 class walletAdmin(admin.ModelAdmin): inlines = [UserrInline] admin.site.register(wallet, walletAdmin)
问题原因
- 模型类名不符合规范:Django模型类需用大驼峰命名(如
User而非user),否则会引发外键引用、Admin注册等隐性错误。 - Inline未指定关联模型:
UserrInline未通过model属性明确关联目标模型,Admin无法识别数据来源。 - TabularInline不支持
list_display:Django内联类不使用list_display配置字段,需通过fields或readonly_fields定义展示内容,且直接调用@property需自定义方法中转。 - 语法错误:
full_name方法定义缺少冒号,导致属性无法正常生效。
解决方案
步骤1:修正模型类名与语法
user.models.py
from django.db import models from wallet.models import Wallet class User(models.Model): name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) wallet = models.ForeignKey(Wallet, on_delete=models.CASCADE) @property def full_name(self): return f"{self.name} {self.last_name}"
wallet.models.py
from django.db import models class Wallet(models.Model): amount = models.IntegerField()
步骤2:修正Admin内联配置
wallet.admin.py
from django.contrib import admin from .models import Wallet from user.models import User class UserInline(admin.TabularInline): model = User readonly_fields = ['get_full_name'] fields = ['get_full_name'] extra = 0 def get_full_name(self, obj): return obj.full_name get_full_name.short_description = 'Full Name' class WalletAdmin(admin.ModelAdmin): inlines = [UserInline] admin.site.register(Wallet, WalletAdmin)
额外优化(可选)
若需让full_name支持排序,可添加排序字段关联:
def get_full_name(self, obj): return obj.full_name get_full_name.short_description = 'Full Name' get_full_name.admin_order_field = 'name' # 按name字段排序
内容的提问来源于stack exchange,提问作者parvaneh moradi pasha
相关产品推荐
相关产品推荐

