Ошибка Django modelformset_factory не отображается в шаблоне

У меня есть modelformset_factory, отображающий 20 форм с 20 именами сотрудников, чьи номера телефонов должны быть введены, но если есть ошибка(и), они не отображаются в шаблоне и введенные данные также теряются. И даже если формы действительны, я не перенаправляюсь на главную страницу. Свежие формы загружаются все время, когда я нажимаю кнопку submit.

class PhoneEntryView(LoginRequiredMixin, FormView):
        template_name = "myportal/ca_entry_form.html"
        success_url = '/myportal/home-page'

        def get_initial(self):
            initial = super().get_initial()
            logged_in_user = User.objects.get(id=self.kwargs['pk'])
            staff_list = Staff.objects.filter(manager=logged_in_user)
            initial_staff = [{'staff': staff} for staff in staff_list]
            staff_qs = Staff.objects.none()
            StaffFormSet = modelformset_factory(Staff, form=StaffForm, formset=StaffModelFormSet, extra=len(staff_list), max_num=len(staff_list), validate_max=True)
            formset = StaffFormSet(queryset=staff_qs, initial=initial_staff)
            initial['initial_staff'] = initial_staff
            initial['StaffFormSet'] = StaffFormSet
            initial['formset'] = formset
            initial['staff_qs'] = staff_qs
            return initial 
        
        def get_form_class(self, *args, **kwargs):
            return self.get_form()

        def get_form(self, *args, **kwargs):
            return self.get_initial()['formset']

        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['formset'] = self.get_form()
            context['form_message'] = 'Update phone directory for your staff'
            return context
        
        def post(self, request, *args, **kwargs):
            StaffFormSet = self.get_initial()['StaffFormSet']
            initial_staff = self.get_initial()['initial_staff']
            submitted_form = StaffFormSet(request.POST, initial=initial_staff)
            
            if submitted_form.is_valid():
                self.form_valid(submitted_form)
                print("This form is valid, Sir!")
            else:
                print("Non Form Errors: ", submitted_form.non_form_errors())
                self.get_context_data()['formset'] = submitted_form
                self.form_invalid(submitted_form)
            return super().post(request, *args, **kwargs)

        def form_valid(self, form, **kwargs):
            saved_forms = form.save(commit=False)
            #Save forms here
            return super().form_valid(form)
        
        def form_invalid(self, form, **kwargs):
            print('form_invalid method is called.')
            return super().form_invalid(form)

Это мой BaseModelFormSet:

class StaffModelFormSet(BaseModelFormSet):

    def clean(self):
        super().clean()
        print(self.errors)
        for form in self.forms:
            phone = form.cleaned_data['phone_number']
            if phone < 0 or len(phone) > 11:
                raise forms.ValidationError("Invalid phone number.")
        return
        

Вот код шаблона для отображения ошибок:

    <div class="alert alert-danger" role="alert">
        {% for error in formset.errors %}
            {{ error }}<br/>
        {% endfor %}
        <p>Errors:</p>
        <p>{{ formset.non_form_errors }}:</p>
    </div>

И print("Non Form Errors: ", submitted_form.non_form_errors()) выводится в терминал.

Попробуйте добавить оператор возврата к форме invalid.

else:
    print("Non Form Errors: ", submitted_form.non_form_errors())
    self.get_context_data()['formset'] = submitted_form
    return self.form_invalid(submitted_form)

Метод суперкласса возвращает httpresponse.

Вернуться на верх