Я использую несколько встроенных форм / встроенных наборов форм в шаблоне, который смог нормально справиться со всем, кроме концепции отображения ошибки формы.
При проверке существует ошибка в функции form_invalid I получите следующую информацию:
[{}, {'__all__': ['An enrollment record already exists for 0-2']}, {}]
После того, как форма Valid отклонена и отправлена в Form_invalid, контекст следует за объектом. Однако в Form_invalid render_to_response вызывает get_context_data, именно здесь ошибка сбрасывается, а не добавляется.
Как сохранить непрерывность аргумента get_context для этих встроенных наборов форм. При попытке удалить аргумент отображаются ошибки, в которых говорится, что inline_formset не соответствует родительскому, но моя ошибка все еще потеряна.
HTML:
<div class="form-group">
<legend>Enrollment</legend>
{{ enrollment.management_form }}
<div id="id_roomenrollment_set_form">
<table>
{% for eForm in enrollment.forms %}
<table class='no_error'>
{{eForm.non_field_errors}}
{{eForm.errors}}
{{ eForm }}
</table>
<hr>
{% endfor %}
</table>
</div>
Форма действительна / недействительна :
'''
Sets the variables to their respective 'instance' objects. This passes the information from the
context dictionary to the variable instance, try and catch to validate for both populated forms and
non populated forms
'''
def form_valid(self, form, note, enrollment, mealCount):
self.object = form.save()
try:
note.instance = self.get_object() #creates note object for saving
enrollment.instance = self.get_object()
mealCount.instance = self.get_object()
except Exception:
note.instance = self.object
enrollment.instance = self.object
mealCount.instance = self.object
ages = set()
#checking for unique enrollments by age group.
for enrollmentForm in enrollment:
ageGroup = enrollmentForm.cleaned_data['age_groups']
if (ageGroup in ages):
enrollmentForm.add_error(None, ValidationError(_('An enrollment record already exists for %(value)s'), params={'value': ageGroup}))
return self.form_invalid(form, note, enrollment, mealCount)
else:
ages.add(ageGroup)
enrollment.save()
note.save()
mealCount.save()
return HttpResponseRedirect(self.get_success_url())
'''
Passes back the validation errors in all forms, utilizing super calls and passing the context
from those items to check validity
'''
def form_invalid(self, form, note, enrollment, mealCount):
print(enrollment.errors) #generates the value at the top of the post
return self.render_to_response(
self.get_context_data(form=form,
note=note,
enrollment=enrollment,
mealCount=mealCount))
def get_context_data(self, **kwargs):
context = super(RoomUpdateView, self).get_context_data(**kwargs)
print(context['enrollment'].errors)
if self.request.POST:
context['form'] = custModelForms.RoomExtendedForm(instance=self.get_object())
context['enrollment'] = enrollmentFormSet(self.request.POST, instance = self.get_object())
context['note'] = roomNoteFormSet(self.request.POST, instance = self.get_object())
context['mealCount'] = roomUniqueMealCountFormSet(self.request.POST, instance=self.get_object())
else:
context['form'] = custModelForms.RoomExtendedForm(instance = self.get_object())
context['enrollment'] = enrollmentFormSet(instance = self.get_object())
context['note'] = roomNoteFormSet(instance = self.get_object())
context['mealCount'] = roomUniqueMealCountFormSet(instance=self.object)
return context