在Django Admin中反向嵌入多个模型

8

假设我有一些Django模型,类似于以下内容:

class Address(models.Model):
    pass

class Person(models.Model):
    address = models.ForeignKey(Address)

class Store(models.Model):
    address = models.ForeignKey(Address)

class Company(models.Model):
    address = models.ForeignKey(Address)

因此,在管理界面中,我希望能够编辑一个人并将地址嵌入其中。

我知道这是可能的,

class Address(models.Model):
    person  = models.ForeignKey(Person, blank=True)
    store   = models.ForeignKey(Store, blank=True)
    company = models.ForeignKey(Company, blank=True)

class Person(models.Model):
    pass

class Store(models.Model):
    pass

class Company(models.Model):
    pass

然后我可以按照惯例进行操作,
class AddressInline(admin.TabularInline):
    model = Address

class PersonAdmin(admin.ModelAdmin):
    model = Person
    inlines = (AddressInLine,)

class CompanyAdmin(admin.ModelAdmin):
    and so on

但这意味着每个人会有多个地址,我的地址模型感觉不太对了。欢迎提供帮助。
2个回答

6
尝试以下操作:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Address(models.Model):
    object_id    = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    of           = generic.GenericForeignKey('content_type', 'object_id' )

class Person(models.Model):
    pass

class Store(models.Model):
    pass

class Company(models.Model):
    pass

然后您可以这样做:
from django.contrib import admin
from django.contrib.contenttypes import generic

class AddressInline(generic.GenericStackedInline):
    model   = Address
    max_num = 1

class PersonAdmin(admin.ModelAdmin):
    model = Person
    inlines = (AddressInLine,)

class CompanyAdmin(admin.ModelAdmin):
    and so on

admin.site.register(Person, PersonAdmin)

1
那么现在如何将Person模型链接到Address呢?它仍然是一个普通的ForeignKey吗? - Greg

3
将类AddressInline(admin.TabularInline)更改为类AddressInline(admin.StackedInline),将使地址内联看起来不太可能有多个。
如果您希望每个AddressInline最多只有1个地址,请将AddressInline.max_num设置为1。
如果没有相关地址,则将AddressInline.extra设置为1,如果需要空白地址表单。
文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

1
是的,这限制了地址数量只有一个 :)。 - Dale O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接