在Django Admin中使用内联

时间:2012-03-29 23:12:39

标签: django django-admin

我似乎在使用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个无用的字段:donorrecipientsponsorAddress(!)必须直接在其上声明warehouseperson。这对我来说没有任何意义。

为什么Django的管理系统不支持在这些模型上进行内联,并且有一个黑客可以绕过它而不必编写视图和表单而不必反转我写的所有关系?

1 个答案:

答案 0 :(得分:0)

*部分解决方案*

正如上面提到的@ilvar所说,我只为Person后代创建了一个继承层次结构:

class Person(models.Model):
    ...

class Donor(Person):
    ...

class Recipient(Person):
    ...

这导致Person的所有字段都显示在Donor的管理员中,这就是我想要的内容:)

不幸的是,Person.emailEmailAddress的关联仍未解决问题:

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创建内联?

相关问题