CreateView form_invalid для нескольких форм?

#django #django-forms #django-class-based-views

#django #django-forms #django-представления на основе классов

Вопрос:

Я работаю с CBV, который использует 2 ModelForm экземпляра. Я хотел бы отобразить отдельные ошибки формы. Кажется, что это немного сложно при использовании нескольких форм в представлении на основе классов.

Вот небольшой фрагмент, чтобы показать, с чем я работаю…

 class EmployeeCreate(CreateView):


    form_class = EmployeeCreateForm
    form_class_2 = AddressCreateForm


    def post(self, request, *args, **kwargs):
        employee_form = self.form_class(request.POST)
        address_form = self.form_class_2(request.POST)
    
        # Make sure both forms are validated
        if employee_form.is_valid() and address_form.is_valid():
            employee = employee_form.save(commit=False)
            address = address_form.save(commit=False)
            employee.parent = self.request.user
            employee.save()
            address.user = employee
            address.save()
            return JsonResponse({'message': 'Employee created successfully.'}, status=200)
        else:
            return self.form_invalid(**kwargs)

    def get_context_data(self, **kwargs):
        # render both forms to create an Account, and Address
        context = super(EmployeeCreateView, self).get_context_data()
        context['employee_form'] = self.form_class
        context['address_form'] =  self.form_class_2
        return context

    def form_invalid(self, **kwargs):
        return JsonResponse({'success': False})
 

Теперь, когда форма недействительна, form_invalid метод вызывается и возвращает сообщение JsonResponse, но я бы предпочел вернуть конкретную ошибку формы.

Я пытаюсь найти способ отображения каждой отдельной ошибки формы для employee_form и address_form . Есть ли возможный способ сделать это переопределение в form_invalid методе?

Заранее благодарю вас!

Ответ №1:

вы возвращаете ошибку обеих форм в одном JsonResponse. Вместо этого вы должны возвращать ошибку разных форм в одном JsonResponse, например

 return JsonResponse({'employee_form_errors': self.form_invalid(employee_form),
'address_form_errors': self.form_invalid(address_form) }, status=400)
 

вы должны использовать индивидуальное использование form_invalid с обеими формами.