开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜