【问题标题】:Including fields from a OneToOneField in Django Admin在 Django Admin 中包含来自 OneToOneField 的字段
【发布时间】:2021-05-13 20:19:33
【问题描述】:

我正在尝试将 OneToOneField 中的字段添加到我的管理视图中。这是我的模型外观的示例。

class Customer(BaseUser):
    name = CharField()
    address = CharField()
    secondary_information = OneToOneField("SecondaryCustomerInfo", on_delete=SET_NULL, null=True)


class SecondaryCustomerInfo(models.Model):
    email = EmailField()

我尝试像这样将字段作为内联添加。

class SecondaryCustomerInfoInline(admin.StackedInline):
    model = SecondaryCustomerInfo


class CustomerAdmin(admin.ModelAdmin):
    inlines = [SecondaryCustomerInfoInline]

但我得到了错误

<class 'user.admin.SecondaryCustomerInfoInline'>: (admin.E202) 'user.SecondaryCustomerInfo' has no ForeignKey to 'user.Customer'.

我习惯于将 OneToOneField 放在辅助模型上,但我的同事要求我将它放在主 Customer 模型上,因为我们将更频繁地访问该信息。我认为改变事情是让我绊倒的原因。如何在 Customer 的管理视图中包含来自 SecondaryCustomerInfo 的字段?

【问题讨论】:

  • 您是否尝试使用 ForeignKey 字段?无论如何,这是一对一的关系。
  • 我没有。是否无法在管理员中使用一对一关系显示此信息?我可以将其更改为 ForeignKey 但仍想知道这是如何完成的。
  • 在管理面板中看不到secondary_information吗?
  • 我可以作为它自己的模型,但不在客户详细信息视图中。
  • Okey 然后试试这个:secondary_information = ForeignKey(SecondaryCustomerInfo, on_delete=SET_NULL, null=True)

标签: django django-models django-admin inlines


【解决方案1】:

答案是使用Django Reverse Admin

来自其文档:

使 django 管理员以更好的方式处理 OneToOneFields 的模块。一对一关系的一个常见用例是将模型“嵌入”到另一个模型中。例如,一个人可能有多个指向地址实体的外键、一个家庭地址、一个公司地址等。 Django 管理员使用选择框显示这些关系,让用户选择要连接到人的地址实体。处理这种关系的一种更自然的方式是使用内联。但是,由于外键放置在所属实体上,因此无法使用 django admins 标准内联类。

class CustomerAdmin(ReverseModelAdmin):
    inline_type = 'stacked'
    inline_reverse = ['secondary_information']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2011-06-22
    • 1970-01-01
    • 2018-07-23
    • 2021-02-25
    • 1970-01-01
    • 2022-10-05
    • 2011-04-18
    相关资源
    最近更新 更多