前言:
-
- 注冊:
-
- 1.寫一個存儲使用者資訊的表
- 2.先編寫注冊界面模闆
- 3.當我們給模闆配置好路由之後,在視圖函數處編寫功能函數。
- 登入:
-
- 1.模闆
- 2.寫視圖函數
要知道如何用django寫出使用者注冊登入的代碼,首先需要知道注冊登入的原理,這裡拿 最簡單的注冊登入方式來解釋
1.注冊
簡單來說,注冊就是把資料寫入資料庫
- 輸入使用者名,密碼,确認密碼
- 一般情況下,如果密碼和确認密碼一樣,則把使用者名和密碼存入資料庫
- 但是這裡我們需要驗證一下使用者名是否已經在資料庫中存在,如果存在則跳回頁面重新注冊,如果不存在則確定兩次輸入的密碼一緻,然後存入資料庫
2.登入
登入可以了解為把資料庫裡的資料拿出來顯示
- 輸入使用者名,密碼
- 如果使用者名在資料庫中存在,則判斷密碼是否一緻
- 如果使用者名在資料庫中不存在,則跳回頁面
注冊:
我的首頁導覽列有一個登入按鈕,點進去到達登入界面,可選擇注冊或者放棄登入:

這是我的注冊頁面
1.寫一個存儲使用者資訊的表
可以根據自己需求喜好,決定是否建立新的app,我這裡是新建立了一個app,然後在model.py裡寫了一個簡單的模型
playObj = PlayerManager()
是注冊自定義管理器,下面會說到
2.先編寫注冊界面模闆
<form class="form-horizontal" role="form" action="{% url 'iyonghu:zhuce' %}" method="post" style="margin-top: 5%">
{% csrf_token %}
<div class="form-group">
<label class="col-sm-3 control-label">使用者名:</label>
<div class="col-sm-9">
<input type="text" placeholder="name" name="usersname">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">密碼:</label>
<div class="col-sm-9">
<input type="password" placeholder="password" name="passsword">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">确認密碼:</label>
<div class="col-sm-9">
<input type="password" placeholder="again" name="again">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button type="submit" class="btn btn-primary">确認注冊</button>
<a href="{% url 'shouye' %}" style="margin-left: 5%">放棄</a>
</div>
<div class="col-sm-offset-3 col-sm-9">
<p style="color: red">{{ p }}</p>
</div>
</div>
</form>
重點是這三個地方:
這是一個form表單,通過
method=‘post’
把畫圈這三個name所帶的資料通過比較安全的方式發送出去。
3.當我們給模闆配置好路由之後,在視圖函數處編寫功能函數。
def zhuce(request):
if request.method == 'POST':
username = request.POST.get('usersname')
password = request.POST.get('passsword')
again = request.POST.get('again')
get_info = Player.playObj.filter(username=username)
if get_info.exists():
p = '使用者名已存在,請重新輸入!'
return render(request,'blogmuban/regsite.html',{'p':p})
else:
if password == again:
user = Player.playObj.createnew(name=username,word=password)
user.save()
p = '注冊成功,登入吧!'
else:
p = '注冊失敗,兩次密碼輸入不一樣!'
return render(request,'blogmuban/regsite.html',{'p':p})
return render(request,'blogmuban/login.html',{'p':p})
如果背景收到的request.method是POST的話,說明沒有異常,則執行下面的代碼:
把從前端收到的資料分别指派。
這裡是從資料庫找與前端輸入的相同的資料,playObj是自己在model寫的一個自定義管理器,就是自定義一個功能
class PlayerManager(models.Manager):
def createnew(self,name,word):
play = self.model()
play.username = name
play.password = word
return play
這裡是自定義一個往資料庫插入資料的功能
上面的filter函數是django自帶的一個篩選功能,可以将key=value的值篩選出來
然後我們把拿到的資料複制給get_info,再判斷他是否存在,如果存在則判斷密碼和确認密碼是否相同。
如果這些驗證都通過了,則調用自定義管理器剛寫的建立新對象的功能,然後将資料存入資料庫
自此,資料庫裡面便有了我們剛剛輸入的資料,代表我們注冊成功!
登入:
1.模闆
登入的模闆的道理跟注冊的模闆一樣,隻是少掉确認密碼而已,不過要有也可以,隻要在後面加一個判斷功能就行了
2.寫視圖函數
def login(request):
username = request.POST.get('username')
password = request.POST.get('password')
if request.method == 'POST':
user = Player.playObj.filter(username=username)
if user.exists():
if user[0].password == password:
request.session['name'] = username
request.session['word'] = password
else:
p = '密碼錯誤,請重新輸入!'
return render(request, 'blogmuban/login.html',{'p':p})
else:
p = '使用者名有誤,請重新輸入!'
return render(request, 'blogmuban/login.html', {'p': p})
return redirect('/')
還是一樣,将前端拿到的資料進行指派
利用filter方法周遊出
username=username
的對象清單指派給user,由于這裡得到的是一個清單是以我們用
user[0].password == password
來判斷
這樣子如果一切都驗證通過,就把這些值交給緩存session,這樣子友善我們前台調用,最後重定向到首頁
如果我們想在首頁看到我們剛剛存入個session,可以這樣子寫:
在首頁視圖函數那裡加一條
這樣如果name有值那就賦給denglu,如果沒有就把‘遊客’賦給denglu
然後傳給前台在模闆中使用,就可以看到啦
如圖為登入和未登入的狀态,後期如果想得到使用者的其他資訊,比如評論,文章什麼的,隻需要用這個session去取資料就行啦!