生活随笔
收集整理的這篇文章主要介紹了
Django1.6 用Form实现注册登录注销修改密码(含代码!)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參照了潘軍杰的博客,但他Django版本有點老了,改動了不少東西,總體來說參考價值還是很大的,點http://www.2goo.info/blog/panjj/Django/2010/06/05/94跳轉
按上Django的可以去目錄下找auth這個包,它涵蓋了登錄注冊的大部分功能,我們拿過來直接用就可以了。我Python按在了D盤,所以目錄就是這個,D:\Python2.7.6\Lib\site-packages\django\contrib\auth。不會用某個函數看一下這里面或者去看官方文檔幫助都很大。最后我會提供工程壓縮包,有興趣的可以下載。
點擊此處下載程序包
1.先建立自己的項目,推薦大家使用eclipse+pydev+django的組合,比我之前一直用的cmd方便太多了!首先說一下我的目錄結構,如圖
MyLogin是創建項目的時候自動創建的,同級的還有manage.py。我自己創建了login文件夾存放登錄的views和form,templates文件夾存放模板。tests、models那些都是自動生成的,這次并沒有用到。
切記在settings.py里設置自己的模板目錄!如果你下載壓縮包一定要改這里,而且不能直接復制地址欄的目錄,要把'\'全部換成‘/’!!!
2.也是從urls入手,其實只需要一個注冊界面和一個登陸界面,所以代碼如下
[python]?view plaincopy
from?django.conf.urls?import?patterns,?include,?url?? from?django.contrib?import?admin?? from?login.views?import?register,mylogin,changepassword?? admin.autodiscover()?? ?? urlpatterns?=?patterns('',?? ????url(r'^admin/',?include(admin.site.urls)),?? ????(r'^register/$',register),?? ????(r'^login/$',mylogin),?? ????(r'^login/register/$',register),?? ????(r'^changepassword/(?P<username>\w+)/$',changepassword),?? )??
第一行是自動生成的,第二、三行是開始就添加的,第四、五行是后續增添功能時另加的。
3.接下來編寫form表單,新建一個py文件命名為form。
注冊的時候我們要求用戶填用戶名、郵箱、還要輸入兩次密碼,所以我們的RegisterForm就誕生了。
[python]?view plaincopy
from?django?import?forms?? class?RegisterForm(forms.Form):?? ????username?=?forms.CharField()?? ????email?=?forms.EmailField()?? ????password?=?forms.CharField(widget=forms.PasswordInput)?? ????password2=?forms.CharField(label='Confirm',widget=forms.PasswordInput)?? ????def?pwd_validate(self,p1,p2):?? ????????return?p1==p2??
需要說明的是widget那個是為了讓輸入內容不顯示出來,而且django會把密碼轉存成一個哈希串,label是在頁面顯示的內容。那個函數是為了判斷兩次密碼輸入是否相同,其實不寫這里寫到views里也可以。
同樣登錄界面只需要用戶名和密碼即可,所以LoginForm更簡單
[python]?view plaincopy
class?LoginForm(forms.Form):?? ????username?=?forms.CharField()?? ????password?=?forms.CharField(widget=forms.PasswordInput)??
4.接下來開始編寫views。首先介紹需要導入的包
[python]?view plaincopy
from?django.shortcuts?import?render_to_response?? from?form?import?RegisterForm,LoginForm,ChangepwdForm?? from?django.contrib.auth?import?authenticate,login?as?auth_login,logout?as?auth_logout?? from?django.http?import?HttpResponsefrom?django.http?import?HttpResponseRedirect??
User的位置發生了變化,我找了很久才找到的。導入login,logout時為了區分所以加了auth前綴
5.簡單起見先寫login視圖
[python]?view plaincopy
def?mylogin(request):?? ????error?=?[]?? ????if?request.method?==?'POST':?? ????????form?=?LoginForm(request.POST)?? ????????if?form.is_valid():?? ????????????data?=?form.cleaned_data?? ????????????username?=?data['username']?? ????????????password?=?data['password']?? ????????????if?login_validate(request,username,password):?? ????????????????return?render_to_response('welcome.html',{'user':username})?? ????????????else:?? ????????????????error.append('Please?input?the?correct?password')?? ????????else:?? ????????????error.append('Please?input?both?username?and?password')?? ????else:?? ????????form?=?LoginForm()?? ????return?render_to_response('login.html',{'error':error,'form':form})??
其中login_validate()如下
[python]?view plaincopy
def?login_validate(request,username,password):?? ????rtvalue?=?False?? ????user?=?authenticate(username=username,password=password)?? ????if?user?is?not?None:?? ????????if?user.is_active:?? ????????????auth_login(request,user)?? ????????????return?True?? ????return?rtvalue??
為了驗證用戶合法性,用到了authenticate函數,參數是username和password,匹配到會返回一個User對象,如果不合法(不存在該用戶或密碼不正確)就會返回None。login.html是自己編寫的模板,其中有兩個要填充的變量error和form,它會返回這兩個變量到模板中來顯示具體出現了什么錯誤。模板有一個地方要注意就是它有兩個按鈕,Login按鈕類型設為submit,一點擊就提交;而Register按鈕設為button,然后其上加一個點擊函數,讓其點擊后跳轉到注冊頁面。window.location.href是讓其在當前頁面進行跳轉,也就是url變成了/login/register/。這也就是在最開始urls里那么寫第四行的原因。login.html內容如下:
[python]?view plaincopy
<html>?? <head>?? ????<title>Login</title>?? ????<script?type="text/javascript">?? ????? ????function?register()?{?? ????????window.location.href?=?'register'?? ????}?? </script>?? </head>?? <body>?? ????<h1>Login</h1>?? ????{%?for?item?in?error?%}?? ????????<p?style="color:red;">{{item}}</p>?? ????{%?endfor?%}?? ?????????????? ????<form?action=""?method="post">?? ????????<table>?? ????????????{{?form.as_table?}}?? ????????</table>?? ?????????? ????????<input?type="submit"?value="Login">?? ????????<input?type="button"?value="Register"?οnclick="register()">?? ????</form>?? </body>?? </html>??
6.有了login再寫register就容易了。它要驗證的內容稍微多一些,一個是驗證要注冊的用戶名是否已存在,因為username是要唯一的,在一個驗證密碼是否相同,這個在Form表單里已經寫過函數了。
[python]?view plaincopy
def?register(request):?? ????error=[]?? ????if?request.method?==?'POST':?? ????????form?=?RegisterForm(request.POST)?? ????????if?form.is_valid():?? ????????????data?=?form.cleaned_data?? ????????????username?=?data['username']?? ????????????email?=?data['email']?? ????????????password?=?data['password']?? ????????????password2=?data['password2']?? ????????????if?not?User.objects.all().filter(username=username):?? ????????????????if?form.pwd_validate(password,?password2):?? ????????????????????user?=?User.objects.create_user(username,?email,?password)?? ????????????????????user.save()?? ????????????????????login_validate(request,username,password)?? ????????????????????return?render_to_response('welcome.html',{'user':username})?? ????????????????else:?? ????????????????????error.append('Please?input?the?same?password')?? ????????????else:?? ????????????????error.append('The?username?has?existed,please?change?your?username')?? ????else:?? ????????form?=?RegisterForm()?????? ????return?render_to_response('register.html',{'form':form,'error':error})??
如果可以注冊,利用create_user函數來創建一個user對象,然后切記user.save()存入數據庫。register.html如下
[python]?view plaincopy
<html>?? <head>?? ????<title>Join?us</title>?? </head>?? <body>?? ????<h1>Register</h1>?? ?? ????{%?if?form.errors?%}?? ????????<p?style="color:?red;">?? ????????????Please?correct?the?error{{?form.errors|pluralize?}}?below.?? ????????</p>?? ????{%?endif?%}?? ????{%?for?item?in?error?%}?? ????????<p?style="color:red;">{{item}}</p>?? ????{%?endfor?%}?? ?????????????? ????<form?action=""?method="post">?? ????????<table>?? ????????????{{?form.as_table?}}?? ????????</table>?? ????????<input?type="submit"?value="Register">?? ????</form>?? </body>?? </html>??
7.最后是注銷,這個很簡單,直接用auth_logout(request)即可,然后返回login界面
[python]?view plaincopy
def?mylogout(request):?? ????auth_logout(request)?? ????return?HttpResponseRedirect('/login/')??
8.在注銷界面我添加了一個修改密碼的選項,讓用戶登錄后可以修改自己的密碼,這個主要用到了user.set_password('new password')。唯一復雜的地方是點擊修改密碼按鈕時要多傳遞過來一個username的參數,這樣才能去查找這個user從而修改其密碼。所以在urls地方那么寫,為了將url里的內容匹配到username變量中,傳遞給changepassword函數
[python]?view plaincopy
def?changepassword(request,username):?? ????error?=?[]?? ????if?request.method?==?'POST':?? ????????form?=?ChangepwdForm(request.POST)?? ????????if?form.is_valid():?? ????????????data?=?form.cleaned_data?? ????????????user?=?authenticate(username=username,password=data['old_pwd'])?? ????????????if?user?is?not?None:?? ????????????????if?data['new_pwd']==data['new_pwd2']:?? ????????????????????newuser?=?User.objects.get(username__exact=username)?? ????????????????????newuser.set_password(data['new_pwd'])?? ????????????????????newuser.save()?? ????????????????????return?HttpResponseRedirect('/login/')?? ????????????????else:?? ????????????????????error.append('Please?input?the?same?password')?? ????????????else:?? ????????????????error.append('Please?correct?the?old?password')?? ????????else:?? ????????????error.append('Please?input?the?required?domain')?? ????else:?? ????????form?=?ChangepwdForm()?? ????return?render_to_response('changepassword.html',{'form':form,'error':error})??
如果還不清楚,可以看下我的welcome.html,應該就會清楚參數是如何傳遞的了
[python]?view plaincopy
<html>?? <head>?? ????<title>Welcome?</title>?? </head>?? <body>?? ????<h1>Welcome?{{user}}!</h1>?? ????<div>?? ?????<a?href="/changepassword/{{user}}">ChangePassword</a>??? ?????<a?href="/login">Logout</a>??? ????</div>?? ?????? ?????? </body>?? </html>??
點擊changepassword后,將user這個變量附加到url上傳遞過去,所以在urls里那個格式就是負責解析這個url的。w+是正則表達式,意思是一個或多個字符。最后是changepassword.html文件,和其它的模板都差不多
[python]?view plaincopy
<html>?? <head>?? ????<title>ChangePassword</title>?? ????? </head>?? <body>?? ????<h1>ChangePassword</h1>?? ????{%?for?item?in?error?%}?? ????????<p?style="color:red;">{{item}}</p>?? ????{%?endfor?%}?? ?????????????? ????<form?action=""?method="post">?? ????????<table>?? ????????????{{?form.as_table?}}?? ????????</table>?? ?????????? ????????<input?type="submit"?value="Enter">?? ????</form>?? </body>?? </html>??
注意:如果數據庫報錯,很有可能是你沒有同步數據庫,運行manage.py syncdb指令同步數據庫。可登錄http://127.0.0.1:8000/admin登錄管理界面
管理員賬號:administrator/symantec
有問題歡迎留言討論交流,轉載請注明出處:http://blog.csdn.net/monkeyduck
總結
以上是生活随笔為你收集整理的Django1.6 用Form实现注册登录注销修改密码(含代码!)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。