1. 在app下 新建 forms.py html
定義表單內容,類型models前端
from django import forms class RegisterForm(forms.Form): username = forms.CharField(label='用戶名', max_length=20) # CharField 對應 html的 input type=text name= 前面的username ,label 對應lable password = forms.CharField(label='密碼', max_length=12, min_length=6, widget=forms.PasswordInput(attrs={'placehodler': # 密碼類型的 input '請輸入長度爲6-12位的密碼'}), error_messages={ # 定義錯誤信息 和上面的屬性對應. 'min_length': '密碼長度小於6位', 'max_length': '密碼長度大於12位' }) password_repeat = forms.CharField(label='再次輸入密碼', widget=forms.PasswordInput()) email = forms.EmailField()
2. 定義視圖,實例化form表單,傳到前端django
from teatcher.forms import RegisterForm # 導入 自定義form def register(request): if request.method == 'GET': form = RegisterForm() # 實例化 return render(request, 'register.html',context={'form': form}) #傳到前端
3. 新增url 及 前端 html模板app
<body>
<form action="">
{% csrf_token %}
{{ form }} # 顯示 表單 內容. form 和 submit 須要手動添加,不在form(只有字段) 範圍內.
<input type="submit" value="提交">
</form>
</body>
<body> <form action="" method='post'> {{ form.as_p }} # form.as_p 每一行加 <o>標籤 <input type="submit" value="提交"> </form> </body>
# views.py
def register(request): if request.method == 'GET': form = RegisterForm() #return render(request, 'register.html', context={'form': form}) if request.method=='POST': form = RegisterForm(request.POST) # 從前端得到了數據, 填充了數據的form 實例 if form.is_valid(): # is_valid()自動判斷是否知足 form 定義時的條件.true 驗證成功
return HttpRespone('註冊成功')
return render(request, 'register.html', context={'form': form}) #若是 上面的條件都不知足(中間沒有return )執行這一條
# 上面的 is_valid 方法. 調用了 form.clean方法 驗證 數據,默認不驗證 二個輸入密碼的一致性.
在forms.py 中 重寫 clean方法.繼承父類的功能,增長新功能.
# 1定義form 表單, 2 在view 中註冊 3.複寫 clean 方法(驗證信息)
from django import forms
class RegisterForm(forms.Form):
username = forms.CharField(label='用戶名', max_length=20) # CharField 對應 html的 input type=text name= 前面的username ,label 對應lable
password = forms.CharField(label='密碼',
max_length=12,
min_length=6,
widget=forms.PasswordInput(attrs={'placehodler': # 密碼類型的 input
'請輸入長度爲6-12位的密碼'}),
error_messages={ # 定義錯誤信息 和上面的屬性對應.
'min_length': '密碼長度小於6位',
'max_length': '密碼長度大於12位'
})
password_repeat = forms.CharField(label='再次輸入密碼', widget=forms.PasswordInput())
email = forms.EmailField()
def clean(self): # 複寫父類的方法
# 調用 is_valid 方法的時候,就會去調用 clean方法
clean_data = super().clean() # 保證父類的 clean方法被執行.要這麼寫. 父類沒有驗證信息一致性的功能,如下爲驗證密碼(變量名看上面的屬性名)
password = clean_data.get('passwrod') # 父類 處理過的數據中 拿到 pssword 變量
password_repeat = clean_data.get('password_repeat') # 父類 處理過的數據中 拿到 password_repeat 變量
if password != password_repeat:
msg = '密碼不一致'
self.add_error('password_repeat', msg) # 給屬性加了一個 error信息.