У меня есть таблицы, которые обмениваются информацией в одной связанной таблице через внешние ключи. Отношения работают, как и ожидалось, однако я пытаюсь выяснить, как автоматически заполнять поля, которые затем используются для фильтрации результатов. Я надеюсь, что приведенный ниже пример иллюстрирует то, что я пытаюсь сделать.
В моделях:
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 используется в настоящее время?
Было бы лучше использовать метод переопределения сохранения в моделях, в админке, или есть лучший способ сделать это?