#django #django-forms
#django #django-forms
Вопрос:
У меня есть модель django, которая выглядит примерно так:
class MyModel(models.Model):
a = models.BooleanField(default=False)
b = models.CharField(max_length=33, blank=False)
c = models.CharField(max_length=40, blank=True)
и соответствующая форма
class MyForm(ModelForm):
class Meta:
model = MyModel
Запрос пользователя на заполнение формы — это двухэтапный процесс. Сначала я спрашиваю, является ли a
это True или False. После отправки (возможно, было бы лучше с ajax, но сначала сделайте это простым) Я могу заполнить выпадающий список вариантами b
и решить, показывать или нет в c
качестве опции. Больше не нужно показывать a
в качестве выбора, это описательный текст.
Итак, я хочу представить форму дважды, и за ней стоит одна и та же модель, которая медленно заполняется. Сначала выберите a
, затем вам напомнят, что a
есть True
, и спросят об b
и c
. Или это a
то False
, о чем нужно спрашивать только b
. После отправки этой второй формы я сохраняю объект.
Я не понимаю, как лучше всего сделать это в django. Один из способов — создать два отдельных класса форм, один из которых имеет скрытые поля. Но если за обоими стоит одна и та же модель, и в модели есть обязательные поля, я ожидаю, что это вызовет у меня проблемы, поскольку первая форма не удовлетворит требованию b
быть непустым. Кроме того, существует небольшая уязвимость, поскольку для обновления модели требуется обновление двух форм (и, вероятно, хотя бы одного представления).
В качестве альтернативы я мог бы использовать немодельные формы и иметь полную свободу, но мне хотелось бы верить, что django предусмотрел эту необходимость, и я могу сделать это проще.
Любые предложения о том, что такое правильная идиома?
Ответ №1:
Для этого вы можете использовать мастер форм из form-tools: https://django-formtools.readthedocs.io/en/latest/wizard.html
Это работает довольно просто, определяя несколько форм и комбинируя их. Затем, в конце концов, вы можете использовать данные по своему вкусу с помощью пользовательской формы done() . Документы расскажут вам все. Вы можете использовать JS, чтобы скрыть некоторые из ваших полей для сверхбыстрого подхода (например, использовать localStorage).