摘要:既然有登錄登出,那么用戶的注冊肯定也是少不了的。用戶在注冊成功后會自動登錄并返回博客列表頁面。總結本章用到了表單類對數據進行驗證清洗等知識,完成了用戶的注冊功能。
既然有登錄登出,那么用戶的注冊肯定也是少不了的。
注冊表單類用戶注冊時會用到表單來提交賬號、密碼等數據,所以需要寫注冊用的表單/userprofile/forms.py:
/userprofile/forms.py ... # 注冊用戶表單 class UserRegisterForm(forms.ModelForm): # 復寫 User 的密碼 password = forms.CharField() password2 = forms.CharField() class Meta: model = User fields = ("username", "email") # 對兩次輸入的密碼是否一致進行檢查 def clean_password2(self): data = self.cleaned_data if data.get("password") == data.get("password2"): return data.get("password") else: raise forms.ValidationError("密碼輸入不一致,請重試。")
上一章也講過,對數據庫進行操作的表單應該繼承forms.ModelForm,可以自動生成模型中已有的字段。
這里我們覆寫了password字段,因為通常在注冊時需要重復輸入password來確保用戶沒有將密碼輸入錯誤,所以覆寫掉它以便我們自己進行數據的驗證工作。def clean_password2()中的內容便是在驗證密碼是否一致了。def clean_[字段]這種寫法Django會自動調用,來對單個字段的數據進行驗證清洗。
覆寫某字段之后,內部類class Meta中的定義對這個字段就沒有效果了,所以fields不用包含password。
需要注意:
驗證密碼一致性方法不能寫def clean_password(),因為如果你不定義def clean_password2()方法,會導致password2中的數據被Django判定為無效數據從而清洗掉,從而password2屬性不存在。最終導致兩次密碼輸入始終會不一致,并且很難判斷出錯誤原因。
從POST中取值用的data.get("password")是一種穩妥的寫法,即使用戶沒有輸入密碼也不會導致程序錯誤而跳出。前面章節提取POST數據我們用了data["password"],這種取值方式如果data中不包含password,Django會報錯。另一種防止用戶不輸入密碼就提交的方式是在表單中插入required屬性,后面會講到。
視圖函數編寫注冊的視圖/userprofile/views.py:
/userprofile/views.py # 引入 UserRegisterForm 表單類 from .forms import UserLoginForm, UserRegisterForm # 用戶注冊 def user_register(request): if request.method == "POST": user_register_form = UserRegisterForm(data=request.POST) if user_register_form.is_valid(): new_user = user_register_form.save(commit=False) # 設置密碼 new_user.set_password(user_register_form.cleaned_data["password"]) new_user.save() # 保存好數據后立即登錄并返回博客列表頁面 login(request, new_user) return redirect("article:article_list") else: return HttpResponse("注冊表單輸入有誤。請重新輸入~") elif request.method == "GET": user_register_form = UserRegisterForm() context = { "form": user_register_form } return render(request, "userprofile/register.html", context) else: return HttpResponse("請使用GET或POST請求數據")
邏輯上結合了發表文章視圖和用戶登錄視圖,沒有新的知識。
用戶在注冊成功后會自動登錄并返回博客列表頁面。
模板和url表單有關的模板文件我們也很熟悉了,新建/templates/userprofile/register.html:
/templates/userprofile/register.html {% extends "base.html" %} {% load staticfiles %} {% block title %} 登錄 {% endblock title %} {% block content %}{% endblock content %}
上面的模板文件中,我們在昵稱、密碼input 標簽中添加了required屬性(前面提到過)。如果用戶不填寫帶有required屬性的字段,表單就不能提交,并提示用戶填寫。實際上前面學習的很多表單都可以添加required屬性來提前驗證數據的有效性。
注冊的入口你可以放在任何喜歡的地方。本文放在登錄頁面中/templates/userprofile/login.html:
/templates/userprofile/login.html ... ...
最后就是在app中配置路由文件/userprofile/urls.py了:
/userprofile/urls.py ... urlpatterns = [ ... # 用戶注冊 path("register/", views.user_register, name="register"), ]測試
運行服務器,進入到登錄頁面,多了注冊的提示:
點擊注冊賬號進入注冊頁面:
填寫好表單后提交(Email地址是可以為空的):
成功登錄并返回了博客列表,功能完成。
總結本章用到了表單類、對數據進行驗證清洗等知識,完成了用戶的注冊功能。
接下來學習如何實現刪除已有的用戶。
有疑問請在杜賽的個人網站留言,我會盡快回復。
或Email私信我:dusaiphoto@foxmail.com
項目完整代碼:Django_blog_tutorial
轉載請告知作者并注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44920.html
摘要:比較流行的解決方案是允許用戶通過第三方登錄,即可以通過微博這類知名社區的授權,從而登錄你的小站,免去了注冊的麻煩。微博微信的登錄方式大致都遵循這個流程本章雖然加載了微博的接口,但是限于篇幅并沒有配置,請讀者查閱官方文檔去實現。 現在我們已經擁有一個可以進行用戶本地登錄的博客系統了。如果有人欣賞你的文章,說不定就會注冊成為本地用戶,并和你好好交流一番。 但頭疼的是,用戶可能每天都在互聯網...
摘要:比如,在一個博客應用中,你可能會創建如下幾個視圖博客首頁展示最近的幾項內容。這些需求都靠視圖來完成。首先寫一個最簡單的視圖函數,在瀏覽器中打印出字符串。調用函數時會返回一個含字符串的對象。換句話說,的作用是將映射到視圖中。 Django 中的視圖的概念是「一類具有相同功能和模板的網頁的集合」。比如,在一個博客應用中,你可能會創建如下幾個視圖: 博客首頁:展示最近的幾項內容。 內容詳情...
摘要:接下來你就可以在項目的任何地方發送通知了像這樣其中的參數釋義發送通知的對象接收通知的對象動詞短語鏈接到動作的對象可選執行通知的對象可選有點繞,舉個栗子杜賽在搭建個人博客中對你發表了評論。有疑問請在杜賽的個人網站留言,我會盡快回復。 憑借你勤奮的寫作,拜讀你文章的用戶越來越多,他們的評論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復。 怎么...
摘要:創建在中的一個代表一個功能模塊。就是項目的基石,因此開發博客的第一步就是創建新的,用來實現跟文章相關的功能模塊。注意之后,的必須配置,否則會報錯。總結本章創建了博客文章功能的,學習了注冊并配置。 創建APP 在Django中的一個app代表一個功能模塊。開發者可以將不同功能的模塊放在不同的app中, 方便代碼的復用。app就是項目的基石,因此開發博客的第一步就是創建新的app,用來實現...
摘要:確認創建成功后,記得在中注冊因為我們想顯示發表評論的時間,修改時區設置為上海的時區。處理錯誤請求發表評論僅接受請求。返回到一個適當的中即用戶發送評論后,重新定向到文章詳情頁面。總結本章實現了發表評論展示評論的功能。 在沒有互聯網的年代,我們用日記來記錄每天的心得體會。小的時候我有一個帶鎖的日記本,生怕被別人看見里面寫了啥,鑰匙藏得那叫一個絕。 現在時代變了,網絡版的日記本:博客,卻巴不...
閱讀 1310·2021-11-22 14:44
閱讀 2445·2021-09-30 09:47
閱讀 1221·2021-09-09 11:56
閱讀 2077·2021-09-08 09:45
閱讀 3953·2021-08-31 09:40
閱讀 1250·2019-08-30 15:52
閱讀 2044·2019-08-30 14:09
閱讀 1578·2019-08-26 17:04