【问题标题】:Inline multiple one-to-one fields in Django admin在 Django admin 中内联多个一对一字段
【发布时间】:2010-12-20 06:52:45
【问题描述】:

我无法让管理模块以一对一的关系内联两个相同的字段模型。为了说明这一点,我做了以下示例,模型 Person 使用两个地址:

class Client(models.Model):
    # Official address
    official_addr = models.OneToOneField(Address, related_name='official')
    # Temporary address
    temp_addr = models.OneToOneField(Address, related_name='temp')

我想启用通过 Django 管理界面添加人员,并内联两个地址。到目前为止,我有这个用于管理配置的代码:

class ClientInline(admin.StackedInline):
    model = Client
    fk_name = "official_addr"

class ClientInline2(admin.StackedInline):
    model = Client
    fk_name = "temp_addr"

class AddressAdmin(admin.ModelAdmin):
    inlines = [ClientInline,ClientInline2]

admin.site.register(Address, AddressAdmin)

它对第一个地址非常有效,但是对于两个地址,界面都表现得很疯狂——复制客户的字段而不是地址。我做错了什么?有更好的方法来内联两个相同的模型吗?

【问题讨论】:

  • 不应该是Client而不是Clent吗?

标签: django django-admin


【解决方案1】:

将您的管理员替换为以下内容:

class ClientInline(admin.StackedInline):
    model = Client
    max_num = 1

class AddressAdmin(admin.ModelAdmin):
    inlines = [ClientInline]

admin.site.register(Address, AddressAdmin)

【讨论】:

    【解决方案2】:

    我不明白你所说的通过复制客户的字段来“表现得很疯狂”是什么意思。这正是你要求它做的——你有两个内联,都指客户端。如果这不是您想要的,您需要反过来定义它。

    【讨论】:

    • 我想内联两个地址。他们两个将形成一个人。如果我写的代码是错误的,你能帮我写“反过来”吗?谢谢。
    【解决方案3】:

    您可以将 ManyToMany 关系与 through= 结合使用 在您的示例中,它将有关 AddressType 模型

    class Client(models.Model):
        addresses = ManyToManyField(Address, through=AddressType, related_name='address_clients')
    
    class AddressType(models.Model):
        type = models.CharField('Type', max_length=255, unique=True)
        client = models.ForeignKey(Client, related_name='client_address_types')
        address = models.ForeignKey(Address, related_name='address_client_types')
    

    现在由管理员添加 2 个对象并使用它

    以后如果您想添加更多类型,只需由管理员添加 1 种类型))例如工作地址

    鉴于它好用:

    client = Client.objects.get(id=...)
    client_tmp_address = client.addresses.get(address_client_types_type='temporary') # If you added temporary Type before
    

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2011-08-27
      • 2011-07-20
      • 2011-08-16
      • 2012-06-09
      • 2016-02-23
      相关资源
      最近更新 更多