Django ModelForm: исключение обязательного поля из ModelForm - PullRequest
1 голос
/ 23 февраля 2012

Допустим, у меня есть куча моделей 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 собственными ключевыми словами.

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