【问题标题】:Listing Related Fields in Django ModelAdmin在 Django ModelAdmin 中列出相关字段
【发布时间】:2011-08-06 10:39:05
【问题描述】:

我通过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__'

【问题讨论】:

  • 查看我对该问题的回答。
  • @Roseman,不,这是一个不同的问题。查看我的编辑。
  • 出于某种原因,人们似乎对我对该问题的回答有疑问。很简单:定义一个返回值的方法(使用标准点语法)并在readonly_fields 中使用该方法的名称。这行得通。

标签: python django django-admin


【解决方案1】:

根据上述 Roseman 的建议,您可以使用内联管理模型以只读方式显示相关(一对一或多对一)数据。这是一个小例子,只是为了确保我们都在同一页面上。您可以在下面看到实现目标的三种方法(如果我正确理解该目标)。

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__namecar__rego 这样的表达式只有在运行 Django 查询时作为过滤器中的关键字参数具有特殊含义。例如,当获取具有特定 rego 编号的汽车的员工时:

Employee.objects.filter(car__rego='111')

希望对您有所帮助。

j

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 2014-02-02
    • 2018-12-03
    • 2020-12-31
    • 2014-05-07
    • 2022-01-21
    • 2021-06-08
    • 2011-03-31
    • 2020-09-03
    相关资源
    最近更新 更多