Допустим, у меня есть куча моделей M_1, ..., M_n, ..., M_2n, так что всего 2n моделей. Каждая из первых n моделей имеет (обязательный) внешний ключ, ссылающийся на модель из последних n моделей. Итак: скажем, что модель M_x имеет (обязательный) внешний ключ FK_x для модели M_2x, где 1 <= x <= n. </p>
Для каждой модели M_x (1 <= x <= n) теперь мне нравится иметь форму модели MF_x. Я требую, чтобы MF_x исключал внешний ключ FK_x, чтобы FK_x не отображался в форме. Поскольку FK_x является обязательным полем, я требую, чтобы поле было предоставлено при создании экземпляра формы следующим образом: </p>
model_2x_instance = M_2x.objects.create(**some_data)
model_x_instance = M_x(FK_x=model_2x_instance, ...)
form_x_instance = MF_x(instance=model_x_instance)
Затем __init__ в MF_x делает следующее, чтобы проверить, задан ли аргумент 'instance' и имеет ли установлен внешний ключ FK_x для модели M_2x:
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance', None)
if not instance:
raise InstanceRequiredError
if not hasattr(instance, 'FK_x') or not instance.FK_x:
raise ForeignKeyRequiredError
...
Затем метод clean MF_x внедряет исключенный FK_x обратно в словарь cleaned_data, так что форма может создать / изменить экземпляр M_x:
def clean(self):
self.cleaned_data.update(FK_x=self.instance.FK_x)
return super(...).clean()
Проблема в том, что я не люблю повторять эти два фрагмента кода для каждой из этих форм моделей. Но я не могу придумать изящного способа сделать так, чтобы все было СУХОЙ.
Если Я мог бы написать что-то вроде этого:
class Meta:
exclude_but_require_and_inject_later = 'FK_x'
общий базовый класс для всех форм моделей MF_x (1 <= x <= n) <em>может применить приведенные выше фрагменты кода для каждого такого исключенного поля. Но (разумно) невозможно расширить класс Meta собственными ключевыми словами.