[oldboy-django][2深入django]form表單clean_xx, clean完成數據驗證+ form錯誤信息


form后台生成form里面的Input標簽,以及設置Input的屬性

# 需求 后台生成form里面的input標簽,並設置input標簽的屬性,
    class RegisterForm(Form):
        email = fields.EmailField()
        password = fields.CharField()
        password2 = fields.CharField()
        code = fields.CharField()
        avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'}))

    def register(request):
        if request.method == 'GET':
            obj = RegisterForm()
            return render(request, 'register.html', {'obj': obj})
    
     <form method="POST" action="/register/" enctype="multipart/form-data">
        {% csrf_token %}
        {{ obj.avatar }}
        {{ obj.usernam }}
     </form>
View Code

向在form里面獲取session值,即傳遞request參數

# form標簽向獲取request里面的值--重寫__init__函數
    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(RegisterForm, self).__init__(*args, **kwargs)
View Code


form驗證某個字段 self.clean_字段名

# form標簽驗證某個字段
    def clean_code(self):
    input_code = self.cleaned_data.get('code')
    session_code = self.request.session.get('code')  # 請查看check_code函數
    if input_code != session_code:
        raise ValidationError('驗證碼錯誤')
    else:
        return input_code
    # self.errors = {'code': ['驗證碼錯誤'], 'xx':[錯誤1,錯誤2]}
View Code


form驗證多個字段 self.clean

# form標簽聯合數據驗證
    def clean(self):
    """
    此時,已經拿到所有的input值,對兩次輸入密碼進行驗證
    """
    p1 = self.cleaned_data.get('password1')
    p2 = self.cleaned_data.get('password2')
    if p1 != p2:
        raise ValidationError('兩次輸入密碼不一致') # 默認放到self.errors['__all__']里面
    else:
        return self.cleaned_data
        # return None
    """
    self.errors = {'__all__': ['兩次輸入密碼不一致'], 'xx':[錯誤1,錯誤2]}
    NON_FIELD_ERRORS = '__all__'   前台獲取需要用到
    此時前端獲取該錯誤; obj.non_field_errors
    """
View Code


form驗證多個字段 self.clean 指明錯誤信息的Key,方便前端使用

# 對整體錯誤的其他設置
    def clean(self):

        if p1 != p2:
            self.add_error('password2', '兩次輸入密碼不一致')
            # 此時不用拋出異常了,因為拋出異常
            # 拋出異常也是執行self.add_error
            return None
        else:
            return self.cleaned_data

    此時在前端顯示該錯誤: obj.errors.password2
View Code


form 的錯誤信息self.errors

# form標簽數據驗證錯誤信息
    self.errors = {'username':[錯誤1, 錯誤2], 'password': [錯誤1, 錯誤2]}
    def clean_xx(self) 如果遇到錯,放到self.errors['xx']里面
    def clean(self) 如果遇到錯,放到self.errors['__all__']里面

    但是如果要前端獲取self.errors['__all__']錯誤,obj.errors.__all__是拿不到的
    而是obj.non_field_errors, 不是self.errors.non_fields_errors
View Code


注冊form

# 完整的forms.py
    # -*- coding: utf-8 -*-
    from django.forms import Form, fields, widgets
    from django.core.exceptions import ValidationError


    class RegisterForm(Form):
        username = fields.CharField(widget=widgets.TextInput(
            attrs={'class': "form-control"}
        ))
        password = fields.CharField(widget=widgets.PasswordInput(
            attrs={'class': "form-control"}
        ))
        password2 = fields.CharField(widget=widgets.PasswordInput(
            attrs={'class': "form-control"}
        ))
        code = fields.CharField(widget=widgets.TextInput(
            attrs={'class': "form-control"}
        ))
        avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'}))

        def __init__(self, request, *args, **kwargs):
            self.request = request
            super(RegisterForm, self).__init__(*args, **kwargs)

        def clean_code(self):
            input_code = self.cleaned_data.get('code').upper()
            session_code = self.request.session.get('code').upper()  # 請查看check_code函數
            if input_code != session_code:
                raise ValidationError('驗證碼錯誤')
            else:
                return input_code
            # self.errors = {'code': ['驗證碼錯誤'], 'xx':[錯誤1,錯誤2]}

        def clean(self):
            """
            此時,已經拿到所有的input值,對兩次輸入密碼進行驗證
            """
            p1 = self.cleaned_data.get('password')
            p2 = self.cleaned_data.get('password2')
            if p1 != p2:
                self.add_error('password2', '兩次輸入密碼不一致') # 此時不用拋出異常了,因為拋出異常
                # 拋出異常也是執行self.add_error
                return None
                # raise ValidationError('兩次輸入密碼不一致')
                #  默認放到self.errors['__all__']里面
                #  執行的是self.add_error('__all__', '兩次輸入密碼不一致')
            else:
                return self.cleaned_data

    """
    self.errors = {'__all__': ['兩次輸入密碼不一致'], 'xx':[錯誤1,錯誤2]}
    NON_FIELD_ERRORS = '__all__'   前台獲取需要用到
    """
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM