Django Admin - Как (автоматически) добавить данные в связанную таблицу, которые затем можно использовать для фильтрации результатов? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть таблицы, которые обмениваются информацией в одной связанной таблице через внешние ключи. Отношения работают, как и ожидалось, однако я пытаюсь выяснить, как автоматически заполнять поля, которые затем используются для фильтрации результатов. Я надеюсь, что приведенный ниже пример иллюстрирует то, что я пытаюсь сделать.

В моделях:

class UtilType(models.Model):
    name = models.CharField()
    description = models.CharField()

    # following boolean fields used to filter table

    is_address = models.BooleanField(default=False)
    is_phone = models.BooleanField(default=False)
    is_email = models.BooleanField(default=False)
    is_domain = models.BooleanField(default=False)

class Address(models.Model):
    address_type = models.ForeignKey(
        UtilType,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name="addresses",
        limit_choices_to={'is_address': True}
    )

class PhoneType(models.Model):
    phone_type = models.ForeignKey(
        UtilType,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name="addresses",
        limit_choices_to={'is_phone': True}
    )
... more models with similar schema

В Admin:

class ContactPhoneNumberInline(admin.StackedInline):
    model = PhoneNumber
    min_num = 0
    max_num = 5
    extra = 0
    exclude = ["company"]
    fields = (
        ("phone_type", "country", "phone_number"),
    )


class ContactEmailAddressInline(admin.StackedInline):
    model = EmailAddress
    min_num = 0
    max_num = 5
    extra = 0
    exclude = ["company"]
    fields = (
        ("email_type", "email_address"),
    )

.... more inlines w/ similar structure

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    fields = (
        "company",
        ("name_first", "name_middle", "name_last",),
        ("name_salutation", "name_suffix", "title"),
    )

    inlines = [
        ContactPhoneNumberInline,
        ContactEmailAddressInline,
        ContactDomainInline,
        ContactAddressInline
    ]

При редактировании контакта Действие, как и ожидалось. Я могу добавить информацию к каждому типу, и типы отображаются фильтрованными, как указано в ForeignKeys.

Однако в окне администратора для UtilType есть логические поля выбора: is_address, is_phone, is_email, is_domain, поэтому пользователь должен выбрать это быть отфильтрованным правильно. Я могу скрыть эти поля с помощью метода exclude.

Но как автоматически заполнить правильное логическое значение (= True), основываясь на том, какой inline используется в настоящее время?

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

1 Ответ

0 голосов
/ 11 апреля 2020

Я не нашел способа сделать это в Django админе. Если кто-то знает, как это будет хорошей информацией. Я разберусь с действием в передней части, как только оно будет разработано. Я не уверен, что это стоит усилий администратора.

...