我通过
TabularInline
在 Django 管理中列出了一个模型。在此内联中,我想使用 Django 的模型遍历语法来列出通过外键从此模型引用的其他模型中的数据。例如
class MyRelatedModel(models.Model):
name = models.CharField(max_length=50)
created = models.DateField(auto_now_add=True)
other = models.ForeignKey('MyOtherRelatedModel')
class MyOtherRelatedModel(models.Model):
name = models.CharField(max_length=50)
created = models.DateField(auto_now_add=True)
class MyRelatedModelInline(admin.TabularInline):
model = MyRelatedModel
fields = ['name', 'created', 'other__name']
#readonly_fields = ['name', 'created', 'other__name']
但是,使用“other__name”会引发 ImproperlyConfigured 错误:
'MyRelatedModelInline.fields' refers to field 'other__name' that is missing from the form
ModelAdmin 实例不支持模型遍历语法吗?如果支持的话,我做错了什么?
编辑:如果我取消注释 readonly_fields,错误将变为:
Caught AttributeError while rendering: 'MyMainModelAdmin' object has no attribute '__name__'
根据罗斯曼上面的建议,您可以使用内联管理模型以只读方式显示相关(一对一或多对一)数据。这是一个小例子,只是为了确保我们都在同一页面上。您可以在下面看到实现目标的三种方法(如果我正确理解该目标的话)。
models.py:
class Company(models.Model):
name = models.CharField(max_length=50)
class Employee(models.Model):
name = models.CharField(max_length=50)
company = models.ForeignKey('Company')
car = models.ForeignKey('Car')
def model_callable(self):
return self.car.rego
class Car(models.Model):
rego = models.CharField(max_length=50)
admin.py:
def unbound_callable(emp):
return emp.car.rego
class EmployeeInline(admin.TabularInline):
model = Employee
fields = ('name', 'model_callable', 'model_admin_callable', unbound_callable)
readonly_fields = ('model_callable', 'model_admin_callable', unbound_callable)
def model_admin_callable(self, emp):
return emp.car.rego
class CompanyAdmin(admin.ModelAdmin):
model = Company
inlines = (EmployeeInline,)
admin.site.register(Company, CompanyAdmin)
如您所见,根据 contrib.admin 的 Django 文档(从 1.2 开始),“readonly_fields”的处理方式与“list_display”相同。
在上面的示例中,当您编辑公司时,您将看到其员工内联。每行的可编辑文本框中都有一个员工姓名,在姓名旁边您将看到员工汽车 rego 的只读文本(emp.car.rego)。
参考您原来的问题,您想将相关数据引用为“other__name”。这行不通。
other__name
或 car__rego
等表达式仅在运行 Django 查询时作为过滤器中的关键字参数具有特殊含义。例如,当获取拥有特定 rego 号码的汽车的员工时:
Employee.objects.filter(car__rego='111')
希望有帮助。
j
检查此示例,它可能会消除您在管理站点上呈现相关字段的疑问。
from django.contrib import admin
from . import models
@admin.register(models.Profile) #Decorator
class ProfileAdmin(admin.ModelAdmin):
list_display= ['first_name','last_name','membership','phone','birth_date'] #Columns to display
list_select_related=['user'] #To avoid extra queries
def first_name(self,profile):
return profile.user.first_name #Foreign key relationship
def last_name(self,profile):
return profile.user.last_name #Foreign key relationship
在这个例子中,我正在渲染配置文件模型,其中用户是用户模型的外键,并且用户模型包含名字,姓氏。