Как работать с несколькими подтипами одного супертипа в админке Django - PullRequest
2 голосов
/ 15 марта 2010

Что было бы лучшим решением для добавления / редактирования нескольких подтипов.

Например, класс супертипа Контакт с классом подтипа Клиент и класс подтипа Поставщик. Способ, показанный здесь, работает, но когда вы редактируете Контакт, вы получаете обе строки, то есть подтип Клиент и подтип Поставщик.

Таким образом, даже если вы хотите добавить только Клиента, вы также получите поля для поставщика и наоборот. Если вы добавите третий подтип, вы получите три группы полей подтипа, в то время как вы фактически хотите только одну группу подтипа, в упомянутом примере: Клиент.

например:.

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

class Client(models.Model):
    contact = models.OneToOneField(Contact, primary_key=True)
    user_name = models.CharField(max_length=128)

class Supplier(models.Model):
    contact.OneToOneField(Contact, primary_key=True)
    company_name = models.CharField(max_length=128)

и в admin.py

class ClientInline(admin.StackedInline):
    model = Client

class SupplierInline(admin.StackedInline):
    model = Supplier

class ContactAdmin(admin.ModelAdmin):
    inlines = (ClientInline, SupplierInline,)

class ClientAdmin(admin.ModelAdmin):
    ...

class SupplierAdmin(admin.ModelAdmin):
    ...

Теперь, когда я хочу добавить Клиента, то есть только Клиента, я редактирую Контакт и получаю строки для Клиента и Поставщика. И, конечно, то же самое для Поставщика.

Есть ли способ избежать этого? Когда я хочу добавить / отредактировать клиента, который я вижу только «Встроенный для клиента», и когда я хочу добавить / изменить поставщика, который я вижу только «Встроенный для поставщика», при добавлении / редактировании контакта?

Или, возможно, есть другой подход. Буду очень признателен за любую помощь или предложение.

1 Ответ

1 голос
/ 15 марта 2010

Что если вместо использования внешнего ключа один к одному для связи с вами унаследовано от него?

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

    class Meta:
        abstract=True # Don't use this line if you want Contact to have its own table

class Client(Contact):
    user_name = models.CharField(max_length=128)

class Supplier(Contact):
    company_name = models.CharField(max_length=128)

Тогда вы можете зарегистрировать Клиента и Поставщика, и они будут делить поля из Контакта, но все равно будут отделены друг от друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...