Использование встроенных строк в Django Admin - PullRequest
0 голосов
/ 30 марта 2012

Кажется, у меня много проблем с использованием встроенных админских сообщений 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 одновременно, и нет смысла дублировать эти данные в БД.)

Кажетсячто администраторский сайт Django действительно жесток относительно своих требований для работы со строками, и он отказывается разрешить мне редактировать Donor, отредактировав его person как встроенный.

Кажется, Django требует, чтобы я переместил всемоих отношений с противоположным концом вещей, так что Person по существу будет иметь 3 бесполезных поля: donor, recipient и sponsor, а Address (!) должно иметь warehouse иperson заявлено непосредственно на них.Это действительно не имеет никакого смысла для меня.

Почему система администрирования Django так против использования встроенных функций на подобных моделях, и есть ли способ обойти это без необходимости писать представления и формы и безотменить все отношения, которые я написал?

1 Ответ

0 голосов
/ 30 марта 2012

* Частичное решение *

Как @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'>

Тьфу.Это стареет.Как я могу создать inline для EmailAddress на администраторе модели Donor?

...