我似乎在使用Django Admin内联方面遇到了很多麻烦。 Django似乎希望关系只能以某种方式表达,以允许对象的内联。例如,我有以下模型:
class Person(models.Model):
first_name = models.CharField(...)
last_name = models.CharField(...)
email = models.OneToOneField("EmailAddress")
address = models.OneToOneField("Address")
class Warehouse(models.Model):
"""A warehouse _has_ an address."""
name = models.CharField(..., default="[Unnamed Warehouse]")
address = models.OneToOneField("Address")
class Donor(models.Model):
"""A donor _is_ a person."""
person = models.OneToOneField(Person)
class Recipient(models.Model):
"""A recipient _is_ a person."""
person = models.OneToOneField(Person)
class Sponsor(models.Model):
"""A sponsor _is_ a person."""
person = models.OneToOneField(Person)
class EmailAddress(models.Model):
name = models.CharField(..., default="Home")
email = models.EmailField()
is_default = models.BooleanField()
class Address(models.Model):
name = models.CharField(..., default="Home")
street_address = models.TextField()
以下是我想在管理员中代表Donor
的方式:
First Name: [person.first_name ]
Last Name: [person.last_name ]
Email: [person.email.email ]
Address: [person.address.street_address]
由于项目要求,我需要将这些字段保留在Person
类中。 (即:Person
可以同时是Donor
和 a Sponsor
,并且在数据库中复制数据没有用处。)< / p>
Django的管理网站似乎非常关注其内联的要求,并且拒绝让我通过编辑Donor
作为内联来编辑person
。
Django似乎要求我将所有关系移到事物的另一端,以便Person
基本上有3个无用的字段:donor
,recipient
和sponsor
和Address
(!)必须直接在其上声明warehouse
和person
。这对我来说没有任何意义。
为什么Django的管理系统不支持在这些模型上进行内联,并且有一个黑客可以绕过它而不必编写视图和表单而不必反转我写的所有关系?
答案 0 :(得分:0)
正如上面提到的@ilvar所说,我只为Person
后代创建了一个继承层次结构:
class Person(models.Model):
...
class Donor(Person):
...
class Recipient(Person):
...
这导致Person
的所有字段都显示在Donor
的管理员中,这就是我想要的内容:)
不幸的是,Person.email
与EmailAddress
的关联仍未解决问题:
class EmailInline(admin.StackedInline):
model = EmailAddress
fields = ('email',)
class DonorAdmin(admin.ModelAdmin):
inlines = (EmailInline,)
当我添加新的Donor
时,我会看到非常熟悉的错误消息:
Exception at /admin/core/donor/add/
<class 'core.models.EmailAddress'> has no ForeignKey to <class 'core.models.Donor'>
唉。这变老了。如何在EmailAddress
型号管理员上为Donor
创建内联?