BaseInlineFormSet does not clean invalid characters
I am trying to clean my inline formset data. I have three rules: 1) must supply at least one name, 2) if you specify a name you must specify both a first and last, and 3) no spaces. When the data saves, the spaces are still saved to the database. What am I doing wrong?
Another issue is that the Validation Errors are not displayed. Why is that?
forms.py:
class UserNameForm(forms.models.BaseInlineFormSet):
def clean(self):
super(UserNameForm, self).clean()
count = 0
for form in self.forms:
try:
firstName = form.cleaned_data.get("name_first")
middleName = form.cleaned_data.get("name_middle")
lastName = form.cleaned_data.get("name_last")
if firstName or middleName or lastName:
if len(firstName) == 0 or len(lastName) == 0:
raise forms.ValidationError("First and Last name are required.")
开发者_Go百科 if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
form.cleaned_data['name_first'] = firstName.replace(" ",'')
form.cleaned_data["name_middle"] = middleName.replace(" ",'')
form.cleaned_data["name_last"] = lastName.replace(" ",'')
except AttributeError:
pass
if count < 1:
raise forms.ValidationError('You must have at least one order')
views.py
UserNameFormSet = inlineformset_factory(Profile, Alias, formset=UserNameForm, extra=2, can_delete=True )
if request.method == 'POST':
cNameFormSet = UserNameFormSet(request.POST, request.FILES, instance=cProfile)
if cNameFormSet.is_valid():
testResults = cNameFormSet.save(commit=False)
for form in testResults:
form.save()
You can apply both a form and formset. Use the formset to validate data across the forms and the form to validate data within the form and raise validation errors.
UserNameFormSet = inlineformset_factory(Profile,
Alias,
form=UserNameForm,
formset=AtLeastOne,
extra=2,
can_delete=True )
class AtLeastOne(forms.models.BaseInlineFormSet):
def clean(self):
count = 0
for form in self.forms:
try:
if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
except AttributeError:
pass
if count < 1:
raise forms.ValidationError('You must have at least one name')
class UserNameForm(forms.ModelForm):
class Meta:
model = Alias
def clean(self):
cleaned_data = self.cleaned_data
# Check 1: Must have first and last.
firstName = cleaned_data.get("name_first")
middleName = cleaned_data.get("name_middle")
lastName = cleaned_data.get("name_last")
if firstName or middleName or lastName:
if len(firstName) == 0 or len(lastName) == 0:
raise forms.ValidationError("First and Last name are required.")
# Check 2: No spaces.
cleaned_data["name_first"] = firstName.replace(" ",'')
cleaned_data["name_middle"] = middleName.replace(" ",'')
cleaned_data["name_last"] = lastName.replace(" ",'')
return cleaned_data
精彩评论