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>
向在form里面獲取session值,即傳遞request參數

# form標簽向獲取request里面的值--重寫__init__函數 def __init__(self, request, *args, **kwargs): self.request = request super(RegisterForm, self).__init__(*args, **kwargs)
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]}
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 """
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
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
注冊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__' 前台獲取需要用到 """