要達成渲染自建規則css
一、局部鉤子函數(某個字段,自定意義規則,不如不能以sb開頭,數據庫已存在等)html
二、全局鉤子函數(校驗兩次密碼是否一致)前端
三、使用css樣式數據庫
register.htmldjango
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<title>註冊頁面</title>
<style>
.errors {
color: red;
margin-left: 20px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-offset-3 col-md-6">
<h1>forms渲染頁面,實現局部刷新</h1>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for form in forms %}
<p>{{ form.label }}:{{ form }}<span class="errors">{{ form.errors.0 }}</span></p>
{% endfor %}
<input type="submit" value="提交"><span class="errors">{{ error }}</span>
</form>
</div>
</div>
</div>
</body>
</html>
views.pybootstrap
from django.shortcuts import render,HttpResponse
from django.core.exceptions import ValidationError
from django import forms
from django.forms import widgets #導入這個模塊就是將前端表單裏的類型修改,從後端修改前端的輸入框類型
class RegForms(forms.Form):
# widget 就是定義前端輸入框的類型,後面的引用就是widget後面的參數是指定輸入框的格式,TextInput是一個類,傳入的參數attrs是一個字典,能夠利用這個參數給前端的標籤取類名或者id名等等來實現引用bootstrap的樣式
name = forms.CharField(min_length=3,max_length=8,label='用戶名',error_messages={'min_length':'用戶名過短','max_length': '用戶名太長了','required':'該字段必填'},widget=widgets.TextInput(attrs={'class':'form-control'}))
pwd = forms.CharField(min_length=3,max_length=8,label='密碼',error_messages={'min_length':'用戶名過短','max_length': '用戶名太長了','required':'該字段必填'},widget=widgets.PasswordInput(attrs={'class':'form-control'}))
re_pwd = forms.CharField(min_length=3,max_length=8,label='確認密碼',error_messages={'min_length':'用戶名過短','max_length': '用戶名太長了','required':'該字段必填'},widget=widgets.PasswordInput(attrs={'class':'form-control'}))
email = forms.EmailField(label='郵箱',error_messages={'invalid':'格式不是郵箱格式','required':'該字段必填'},widget=widgets.EmailInput(attrs={'class':'form-control'}))
'''局部校驗,就是校驗某個字段'''
'''寫法固定,就是clean_字段名,就是重寫字段校驗規則的固定寫法'''
def clean_name(self):
# self就是當前forms對象,cleand_data就是清洗後的數據,從字典中取出name
name = self.cleaned_data.get('name')
# 若是以sb爲開頭
if name.startswith('sb'):
# 這裏要拋一個異常,並且是一個ValidationError,這個ValidationError是一個模塊要導入
raise ValidationError('不能以sb開頭')
else:
return name
'''全局鉤子函數(校驗兩次密碼不一致),用clean函數這個是固定的,獲取清洗後的數據,而後進行判斷用raise拋異常便可'''
def clean(self):
pwd = self.cleaned_data.get('pwd') # 從清洗後的數據中獲取pwd
re_pwd = self.cleaned_data.get('re_pwd')
if pwd == re_pwd:
return self.cleaned_data
else:
raise ValidationError('兩次密碼不一致')
def register(request):
if request.method == 'GET':
forms = RegForms()
error=''
elif request.method == 'POST':
forms = RegForms(request.POST)
if forms.is_valid():
print('這裏就是清洗後的數據: ',forms.cleaned_data)
return HttpResponse('註冊成功')
else:
errors_dic = forms.errors
print(errors_dic)
print('這裏就是錯誤的數據: ',forms.errors.as_data)
# 這裏獲取全局鉤子函數的錯誤信息,就要用__all__,而後全局的錯誤信息多是多個的,因此取最近的一個就是索引位是0的位置 error = forms.errors.get('__all__')[0] return render(request,'register.html',{'forms':forms,'error':error})