Как сохранить несколько моделей с несколькими modelForms в одном django form-tools WizardView - PullRequest
1 голос
/ 12 июля 2020

Вот мой сценарий:

У меня две модели:

class Person(models.Model):
    # --- model fields ---

class Qualification(models.Model):
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)
    # --- other fields --- 

И формы модели:

class PersonalForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['first_name', 'last_name', 'email', 'id_number', 'date_of_birth']

class IsQualifiedForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['is_qualified']

class QualificationForm(forms.ModelForm):
    class Meta:
        model = Qualification
        fields = ['level', 'course_name', 'attainment']

И, наконец, мой вид мастера:

class Wizard(SessionWizardView):
    template_name = 'demo/wizard_test.html'
    form_list = [
        ("personal", PersonalForm),
        ("is_qualified", IsQualifiedForm),
        ("qualifications", QualificationForm),
    ]

    def get_form_instance(self, step):
        return self.instance_dict.get(step, None)

    def done(self, form_list, **kwargs):
        # What is the exact logic to be applied here to save the model forms concurrently?
        return redirect('home')

Я пытаюсь сохранить форму, но возникают ошибки:

Когда я пытаюсь вызвать:

for form in form_list:
    form.save()

в методе done(), я получаю ошибка, потому что is_qualified перехватывается как null на первом этапе.

Плюс, как мне установить значение поля owner для текущего созданного человека?

Любая помощь будет будут признательны.

1 Ответ

0 голосов
/ 28 июля 2020

Если is_qualified не допускает значения NULL в вашей модели Person, проверка всегда будет неудачной. Что вы можете сделать, так это сохранить и PersonalForm, и IsQualifiedForm в один go, поскольку они в любом случае относятся к одной и той же модели. Для этого установите значения одной формы в другой. Например:

def done(self, form_list, **kwargs):
    person = form_list[0].save(commit=False)
    person.is_qualified = form_list[1].cleaned_data['is_qualified']
    person.save()
    return redirect('home')

Некоторые примечания:

  1. Вероятно, вам следует использовать именованные шаги вместо того, чтобы полагаться на индекс формы
  2. Если ваш случай так же прост, как форму, которую вы предоставили, вы должны просто сделать первые две формы одной формой
...