I am trying to get validation errors to appear on my web page when using an inlineformset_factory. I have a main form called PersonalInformation form and 3 inline forms (Relative, PositionHeld and Phone). I am receiving the main form errors on my page, but I can't get the 3 inline forms to display the errors.
Do I need to write custom errors?
Can anyone help? I have searched on Google and tried several different things with no luck.
Thanks.
#form.py
class PersonalInformationForm(forms.ModelForm):
class Meta(object):
model = Applicant
fields = ('position', 'salutation', 'first_name', 'middle_name', 'last_name', 'suffix',
'address1', 'address2', 'city', 'state', 'zip_code', 'province', 'country', 'origin_country',
'is_us_armed_forces', 'armed_forces_branch', 'is_relative_of_pcusa',
'is_previous_employee', 'is_legal_work_in_us',)
def __init__(self, *args, **kwargs):
super(PersonalInformationForm, self).__init__(*args, **kwargs)
self.fields['address1'].required = True
self.fields['city'].required = True
self.fields['zip_code'].required = True
self.fields['country'].required = True
self.fields['origin_country'].required = True
self.fields['is_legal_work_in_us'].required = True
def clean(self):
if 'province' in self.cleaned_data and self.cleaned_data.get('province') == '':
if not self.cleaned_data.get('state'):
self._errors['state'] = ErrorList(['Must select state if province is not entered.'])
if self.cleaned_data.get('is_us_armed_forces'):
if self.cleaned_data.get('armed_forces_branch') == '':
self._errors['armed_forces_branch'] = ErrorList(['You must enter branch if you checked that you served in the U.S. Armed Forces.'])
return self.cleaned_data
#views.py
@login_required
def personal_information(request, expected_applicant_id, position_id, private_code):
expected_applicant = get_object_or_404(ExpectedApplicant, \
pk=expected_applicant_id, position_id=position_id, private_code=private_code)
applicant = None
applicant_qs = Applicant.objects.filter(user=request.user, position=expected_applicant.position)
if applicant_qs.count() > 0:
applicant = applicant_qs[0]
else:
applicant = Applicant(user=request.user, position=expected_applicant.position, status = APPLICATION_STATUS_INCOMPLETE)
RelativeInlineFormSet = inlineformset_factory(Applicant, Relative, can_delete=False, extra=1)
PositionHeldInlineFormSet = inlineformset_factory(Applicant, PositionsHeld, can_delete=False, extra=1)
PhoneInlineFormSet = inlineformset_factory(Applicant, Phone, can_delete=False, extra=2)
applicant.salutation = expected_applicant.salutation
applicant.suffix = expected_applicant.suffix
applicant.first_name = expected_applicant.first_name
applicant.middle_name = expected_applicant.middle_name
applicant.last_name = expected_applicant.last_name
applicant.state = expected_applicant.state
applicant.city = expected_applicant.city
applicant.save()
form = PersonalInformationForm(instance=applicant)
formset1 = RelativeInlineFormSet(instance=applicant)
formset2 = PositionHeldInlineFormSet(instance=applicant)
formset3 = PhoneInlineFormSet(instance=applicant)
position_title = expected_applicant.position.position_title
complete_name = expected_applicant.get_complete_name()
if request.POST:
form = PersonalInformationForm(request.POST, request.FILES, instance=applicant)
if form.is_valid():
applicant = form.save(commit=False)
applicant.save()
phone_formset = PhoneInlineFormSet(request.POST, instance=applicant)
relative_formset = RelativeInlineFormSet(request.POST, instance=applicant)
position_formset = PositionHeldInlineFormSet(request.POST, instance=applicant)
if phone_formset.is_valid() and relative_formset.is_valid() and position_formset.is_valid():
phone_formset.save()
relative_formset.save()
position_formset.save()
context = {
'form': form,
'formset1': formset1,
'formset2': formset2,
'formset3': formset3,
'position_title': position_title,
'complete_name': complete_name,
}
return render_to_response('applications/personal_information.html', context,
context_instance=RequestContext(request))