двухэтапная отправка форм django

#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).