我无法让管理模块以一对一的关系内联两个相同的字段模型。为了说明这一点,我做了以下示例,模型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)
它适用于第一个地址,但是这两个地址的界面都很疯狂 - 复制客户端的字段而不是地址。我做错了什么?有没有更好的方法让两个相同的模型内联?
答案 0 :(得分:4)
使用以下内容替换您的管理员:
class ClientInline(admin.StackedInline):
model = Client
max_num = 1
class AddressAdmin(admin.ModelAdmin):
inlines = [ClientInline]
admin.site.register(Address, AddressAdmin)
答案 1 :(得分:0)
我无法通过复制客户的字段来理解你对'表演疯狂'的意思。这正是你要求它做的 - 你有两个内联,都指客户。如果这不是你想要的,你需要反过来定义它。
答案 2 :(得分:0)
您可以通过=使用ManyToMany关系 在您的示例中,它将涉及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