Django商城項(xiàng)目注冊(cè)功能的實(shí)現(xiàn)
設(shè)計(jì)到的前端知識(shí)
項(xiàng)目的前端頁(yè)面使用vue來(lái)實(shí)現(xiàn)局部刷新,通過(guò)數(shù)據(jù)的雙向綁定實(shí)現(xiàn)與用戶的交互,下面來(lái)看一下需求,在用戶輸入內(nèi)容后,前端需要做一些簡(jiǎn)單的規(guī)則校驗(yàn),我們希望在在用戶輸入后能夠?qū)崟r(shí)檢測(cè),如果有錯(cuò)誤能夠在輸入框的下方顯示出來(lái)。
<li>
<label>用戶名:</label>
<input type="text" name="username" id="user_name">
<span class="error_tip">請(qǐng)輸入5-20個(gè)字符的用戶</span>
</li>
<li>
<label>密碼:</label>
<input type="password" name="password" id="pwd">
<span class="error_tip">請(qǐng)輸入8-20位的密碼</span>
</li>
上面是一個(gè)用戶和密碼的輸入框,當(dāng)用戶輸入完用戶名以后,光標(biāo)離開(kāi)輸入框,能夠?qū)崟r(shí)的檢測(cè)輸入內(nèi)容的正確性,當(dāng)輸入有問(wèn)題的時(shí)候,在輸入框的下方顯示錯(cuò)誤信息。
v-model實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,v-on進(jìn)行事件綁定,v-show是控制dom顯示與否,下面是加入vue后的部分代碼
<li>
<label>用戶名:</label>
<input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
<span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
<label>密碼:</label>
<input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
<span class="error_tip" v-show="error_password">請(qǐng)輸入8-20位的密碼</span>
</li>
用戶輸入的用戶名和username變量綁定,光標(biāo)消失觸發(fā)綁定時(shí)間check_username,通過(guò)v-show綁定到布爾值變量error_name,來(lái)控制是否顯示字符串變量error_name_message,其他的輸入框都類似這種操作。
注冊(cè)業(yè)務(wù)實(shí)現(xiàn)
前端注冊(cè)業(yè)務(wù)邏輯
注冊(cè)表單代碼:
<form method="post" class="register_form" >
{{ csrf_input }}
<ul>
<li>
<label>用戶名:</label>
<input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
<span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
<label>密碼:</label>
<input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
<span class="error_tip" v-show="error_password">請(qǐng)輸入8-20位的密碼</span>
</li>
<li>
<label>確認(rèn)密碼:</label>
<input type="password" v-model="password2" @blur="check_password2" name="password2"
id="cpwd">
<span class="error_tip" v-show="error_password2">兩次輸入的密碼不一致</span>
</li>
<li>
<label>手機(jī)號(hào):</label>
<input type="text" v-model="mobile" @blur="check_mobile" name="mobile" id="phone">
<span class="error_tip" v-show="error_mobile">[[ error_mobile_message ]]</span>
</li>
<li>
<label>圖形驗(yàn)證碼:</label>
<input type="text" name="image_code" id="pic_code" class="msg_input">
<img src="{{ static('images/pic_code.jpg') }}" alt="圖形驗(yàn)證碼" class="pic_code">
<span class="error_tip">請(qǐng)?zhí)顚憟D形驗(yàn)證碼</span>
</li>
<li>
<label>短信驗(yàn)證碼:</label>
<input type="text" name="sms_code" id="msg_code" class="msg_input">
<a href="javascript:;" rel="external nofollow" class="get_msg_code">獲取短信驗(yàn)證碼</a>
<span class="error_tip">請(qǐng)?zhí)顚懚绦膨?yàn)證碼</span>
</li>
<li class="agreement">
<input type="checkbox" name="allow" id="allow" v-model="allow" @change="check_allow">
<label>同意”商城用戶使用協(xié)議“</label>
<span class="error_tip" v-show="error_allow">請(qǐng)勾選用戶協(xié)議</span>
</li>
<li class="reg_sub">
<input type="submit" value="注 冊(cè)" @change="on_submit">
{% if register_errmsg %}
<span class="error_tip2">{{ register_errmsg }}</span>
{% endif %}
</li>
</ul>
</form>
導(dǎo)入vue.js和ajax請(qǐng)求的js庫(kù)
<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
準(zhǔn)備register.js文件
register.js文件主要處理注冊(cè)頁(yè)面的交互事件,并且向服務(wù)端提交注冊(cè)表單請(qǐng)求
<script type="text/javascript" src="{{ static('js/register.js') }}"></script>
下面是實(shí)現(xiàn)的前端校驗(yàn)邏輯以及表單提交邏輯
methods: {
// 校驗(yàn)用戶名
check_username() {
let re = /^[a-zA-Z0-9_-]{5,20}$/;
if (re.test(this.username)) {
this.error_name = false;
} else {
this.error_name_message = '請(qǐng)輸入5-20個(gè)字符的用戶名';
this.error_name = true;
}
},
// 校驗(yàn)密碼
check_password() {
let re = /^[0-9A-Za-z]{8,20}$/;
this.error_password = !re.test(this.password);
},
// 校驗(yàn)確認(rèn)密碼
check_password2() {
if (this.password !== this.password2) {
this.error_password2 = true;
} else {
this.error_password2 = false;
}
},
// 校驗(yàn)手機(jī)號(hào)
check_mobile() {
let re = /^1[3-9]\d{9}$/;
if (re.test(this.mobile)) {
this.error_mobile = false;
} else {
this.error_mobile_message = '您輸入的手機(jī)號(hào)格式不正確';
this.error_mobile = true;
}
},
// 校驗(yàn)是否勾選協(xié)議
check_allow() {
this.error_allow = !this.allow;
},
// 監(jiān)聽(tīng)表單提交事件
on_submit() {
this.check_username();
this.check_password();
this.check_password2();
this.check_mobile();
this.check_allow();
# 輸入字段中有一個(gè)不符合規(guī)則就禁止
if (this.error_name === true || this.error_password === true || this.error_password2 === true
|| this.error_mobile === true || this.error_allow === true) {
// 禁用表單的提交
window.event.returnValue = false;
}
},
}
后端業(yè)務(wù)注冊(cè)邏輯
在用戶輸完用戶名之后,我們往往希望能夠跟快的給出這個(gè)用戶名是否符合注冊(cè)需求,前面只是對(duì)用戶名的規(guī)則進(jìn)行了校驗(yàn),還想知道他是否已經(jīng)在系統(tǒng)注冊(cè)過(guò)了,不然當(dāng)用戶都輸完提交注冊(cè)再給出用戶名或者手機(jī)號(hào)已經(jīng)注冊(cè)過(guò),體驗(yàn)不是特別好。所以需要在光標(biāo)離開(kāi)用戶名輸入框的時(shí)候就請(qǐng)求服務(wù)端來(lái)判斷是否注冊(cè)過(guò)。
定義路由
path('register/', views.RegisterView.as_view(), name='register'), # name添加命名空間
path('usernames/<str:username>', views.UsernameCountView.as_view(), name="username"),
re_path(r'mobiles/(?P<mobile>1[3-9]\d{9})', views.MobileCountView.as_view(), name='mobile')
編寫視圖類
class UsernameCountView(View):
def get(self, request, username):
"""
查詢?cè)撚脩裘欠裨谙到y(tǒng)中存在
:param request: 請(qǐng)求對(duì)像
:param username: 前端傳遞的用戶名
:return:
"""
count = User.objects.filter(username=username).count()
return http.JsonResponse({'code':1001, 'msg':'用戶已存在'}) if count == 1 \
else http.JsonResponse({'code': 1000, 'msg': ''})
這里沒(méi)有對(duì)響應(yīng)做統(tǒng)一處理封裝,后面專門介紹一下。
然后就是注冊(cè)視圖類的編寫了:
class RegisterView(View):
"""用戶注冊(cè)視圖類"""
def get(self, request):
'''獲取注冊(cè)頁(yè)面'''
return render(request, 'register.html')
def post(self, request):
""""""
username = request.POST.get('username')
password = request.POST.get('password')
password2 = request.POST.get('password2')
mobile = request.POST.get('mobile')
allow = request.POST.get('allow')
# 判斷參數(shù)是否齊全
if not all([username, password, password2, mobile, allow]):
return http.HttpResponseForbidden('缺少必傳參數(shù)')
# 判斷用戶名是否是5-20個(gè)字符
if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
return http.HttpResponseForbidden('請(qǐng)輸入5-20個(gè)字符的用戶名')
# 判斷密碼是否是8-20個(gè)數(shù)字
if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
return http.HttpResponseForbidden('請(qǐng)輸入8-20位的密碼')
# 判斷兩次密碼是否一致
if password != password2:
return http.HttpResponseForbidden('兩次輸入的密碼不一致')
# 判斷手機(jī)號(hào)是否合法
if not re.match(r'^1[3-9]\d{9}$', mobile):
return http.HttpResponseForbidden('請(qǐng)輸入正確的手機(jī)號(hào)碼')
# 判斷是否勾選用戶協(xié)議
if allow != 'on':
return http.HttpResponseForbidden('請(qǐng)勾選用戶協(xié)議')
try:
user = User.objects.create_user(username=username, password=password, mobile=mobile)
except DatabaseError as e:
return render(request, 'register.html', {'register_errmsg': e.args})
# 注冊(cè)成功保存會(huì)話
login(request, user)
return redirect(reverse('contents:index'))
django提供的login方法,封裝了寫入session的操作,幫助我們快速登入一個(gè)用戶,并實(shí)現(xiàn)狀態(tài)保持,將通過(guò)認(rèn)證的用戶的唯一標(biāo)識(shí)信息(比如:用戶ID)寫入到當(dāng)前瀏覽器的 cookie 和服務(wù)端的 session 中。
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) request.session[BACKEND_SESSION_KEY] = backend request.session[HASH_SESSION_KEY] = session_auth_hash
session會(huì)存入redis,之前在工程創(chuàng)建時(shí)進(jìn)行session存儲(chǔ)的配置
SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "session"
鏈接: https://pan.baidu.com/s/1dFliI6KkNubd4k_OTEpqDA 提取碼: h3dp
以上就是Django商城項(xiàng)目注冊(cè)功能的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Django 注冊(cè)功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- django+vue實(shí)現(xiàn)注冊(cè)登錄的示例代碼
- django注冊(cè)用郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
- 通用的Django注冊(cè)功能模塊實(shí)現(xiàn)方法
- Django怎么在admin后臺(tái)注冊(cè)數(shù)據(jù)庫(kù)表
- Django用戶登錄與注冊(cè)系統(tǒng)的實(shí)現(xiàn)示例
- django 框架實(shí)現(xiàn)的用戶注冊(cè)、登錄、退出功能示例
- django實(shí)現(xiàn)用戶注冊(cè)實(shí)例講解
- Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能
- Python Django 實(shí)現(xiàn)簡(jiǎn)單注冊(cè)功能過(guò)程詳解
- django的登錄注冊(cè)系統(tǒng)的示例代碼
- django 通過(guò)ajax完成郵箱用戶注冊(cè)、激活賬號(hào)的方法
相關(guān)文章
Python實(shí)現(xiàn)仿真雙徑效應(yīng)的方法
雙徑模型是一種很好的近似,能夠準(zhǔn)確地反映信號(hào)的傳播特性。這篇文章主要介紹了Python實(shí)現(xiàn)仿真雙徑效應(yīng)的方法,感興趣的小伙伴們可以參考一下2021-05-05
Python實(shí)現(xiàn)格式化輸出的實(shí)例詳解
這篇文章主要為大家介紹了Python語(yǔ)法中實(shí)現(xiàn)格式化輸出的方法,本文通過(guò)幾個(gè)實(shí)例為大家進(jìn)行了詳細(xì)的講解,感興趣的小伙伴可以了解一下2022-08-08
利用python在大量數(shù)據(jù)文件下刪除某一行的例子
今天小編就為大家分享一篇利用python在大量數(shù)據(jù)文件下刪除某一行的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python爬蟲(chóng)智能翻頁(yè)批量下載文件的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲(chóng)智能翻頁(yè)批量下載文件的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02
pytorch關(guān)于卷積操作的初始化方式(kaiming_uniform_詳解)
這篇文章主要介紹了pytorch關(guān)于卷積操作的初始化方式(kaiming_uniform_詳解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù)
這篇文章主要介紹了PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù),在本次的分類任務(wù)當(dāng)中,我們使用的數(shù)據(jù)集是 Mnist 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集大家都比較熟悉,需要的朋友可以參考下2023-03-03

