日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django1.6 用Form实现注册登录注销修改密码(含代码!)

發布時間:2025/6/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现注册登录注销修改密码(含代码!)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。