Ошибка 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.