1フロントエンド部(導入とjQueryブートストラップ)
< DIV クラス= "コンテナ" >
< DIV クラス= "COL-MD-8 COL-MD-オフセット-2" >
{フォーム%で項目の%}
< DIV クラス= "フォームグループ" >
< lable > {{ item.label}} </ lable >
{{アイテム}}
< スパンクラス= "エラープル右" > </ スパン>
</ DIV >
{%ENDFOR%}
< 入力タイプ= "送信します"クラス= "BTN BTN-主要reg_btn"値= "提交" >
</ DIV >
</ DIV >
< スクリプト>
$(' .reg_btn ' ).click(関数(){
$アヤックス({
URL:'' 、
種類:" ポスト" 、
データ型:" JSON " 、
データ:{
ユーザー:$(' #id_user ' ).val()、
PWD:$(' #id_pwd ')。H()
r_pwd:$(' #id_r_pwd ' ).val()、
電子メール:$(' #id_email ' .val)()、
csrfmiddlewaretoken:$(" [名= 'csrfmiddlewaretoken'] " ).val()、
}、
成功:機能(RES ){
場合(res.user){
LOCATION.HREF = ' /ログイン/ '
} 他{
$(' .ERROR ' )の.html('' )。
$(" 。' ).RemoveClass(' -エラーが発生しました' );
// ページに表示される対応する情報横断するため
の$ .each(res.err、機能(I、J){
/ * * IF(I ==' __ __すべて「){
$を...( '#id_r_p')次()HTML(J [0])CSS( '色'、 '赤')親()addClass( 'はエラー'); ..
}他{
$(「# _ ID '.. + I).next()HTML(J [0])CSS('色''レッド・エラーが持つ) ')親()addClass(..';
} * * /
// エラースパン情報が生成に表示されます
($ ' #id_ ' + I).next()。0 。])、CSS(' 色' 、' 赤' ).parent()addClass(' エラーを有しています' );
});
}
}
})。
});
</ スクリプト>
【0002】パイソン
2.1対はユーザテーブル拡張アセンブリフィールドをジャンゴ
(1)モデルのユーザーテーブルに新しいフィールドを追加
django.db 輸入モデル
から django.contrib.auth.models インポートAbstractUser
#がここにあなたのモデルを作成します。
クラスUSER_INFO(AbstractUser):
TEL = models.CharField(MAX_LENGTH = 32)
(2)変更のユーザ認証テーブルの設定情報のコンポーネントを設定します
AUTH_USER_MODEL='app01.user_info'
修改之后需重新迁移数据库,如果无需添加新字段可省去上述步骤,直接使用django默认提供的auth_user表
2.2 业务代码
from django.http import JsonResponse
from django import forms
from app01.models import user_info
from django.core.exceptions import ValidationError
import re
from django.forms import widgets
#注册视图函数
def register(request):
if request.method=='GET':
form=UserForm()
return render(request,'register.html',locals())
elif request.method=="POST":
res={"user":None,'err':""}
form=UserForm(request.POST)
#验证用户信息
if form.is_valid():
res['user']=form.cleaned_data.get('user')
user=form.cleaned_data.get('user')
pwd=form.cleaned_data.get('pwd')
email=form.cleaned_data.get('email')
user_info.objects.create_user(username=user,password=pwd,email=email)
else:
res['err']=form.errors
return JsonResponse(res)
#创建验证规则对象
class UserForm(forms.Form):
user=forms.CharField(max_length=32,label='用户名')
#widget = widgets.PasswordInput()前端密码密文显示
pwd=forms.CharField(max_length=32,label='密码',widget=widgets.PasswordInput())
r_pwd=forms.CharField(max_length=32,label='确认密码',widget=widgets.PasswordInput())
email=forms.EmailField(max_length=32,label='邮箱')
#使页面渲染时增加需要的属性
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for filed in self.fields.values():
filed.widget.attrs.update({'class':"form-control"})
#设置钩子,对相应的验证框添加新的验证规则(不一定会被执行)
def clean_user(self):
val=self.cleaned_data.get('user')
user=user_info.objects.filter(username=val).first()
if user:
raise ValidationError('用户已存在')
else:
return val
def clean_pwd(self):
val = self.cleaned_data.get('pwd')
if val.isdigit():
raise ValidationError('密码不能为纯数字')
else:
return val
def clean_email(self):
val=self.cleaned_data.get('email')
if re.search('\[email protected]$',val):
return val
else:
raise ValidationError('必须为163邮箱')
# 全局钩子,此方法一定会被执行
def clean(self):
pwd=self.cleaned_data.get('pwd')
r_pwd=self.cleaned_data.get('r_pwd')
if pwd and r_pwd and pwd!=r_pwd:
# raise ValidationError('密码不一致')
self.add_error('r_pwd',ValidationError('两次密码不一致'))
else:
return self.cleaned_data