既然有登陸登出,那麼用戶的註冊確定也是少不了的。html
用戶註冊時會用到表單來提交帳號、密碼等數據,因此須要寫註冊用的表單/userprofile/forms.py
:python
/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
,能夠自動生成模型中已有的字段。git
這裏咱們覆寫了password
字段,由於一般在註冊時須要重複輸入password
來確保用戶沒有將密碼輸入錯誤,因此覆寫掉它以便咱們本身進行數據的驗證工做。def clean_password2()
中的內容即是在驗證密碼是否一致了。def clean_[字段]
這種寫法Django會自動調用,來對單個字段的數據進行驗證清洗。github
覆寫某字段以後,內部類class Meta
中的定義對這個字段就沒有效果了,因此fields
不用包含password
。數據庫
須要注意:django
def clean_password()
,由於若是你不定義def clean_password2()
方法,會致使password2中的數據被Django斷定爲無效數據從而清洗掉,從而password2
屬性不存在。最終致使兩次密碼輸入始終會不一致,而且很難判斷出錯誤緣由。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請求數據")
邏輯上結合了發表文章視圖和用戶登陸視圖,沒有新的知識。app
用戶在註冊成功後會自動登陸並返回博客列表頁面。函數
表單有關的模板文件咱們也很熟悉了,新建/templates/userprofile/register.html
:post
/templates/userprofile/register.html {% extends "base.html" %} {% load staticfiles %} {% block title %} 登陸 {% endblock title %} {% block content %} <div class="container"> <div class="row"> <div class="col-12"> <br> <form method="post" action="."> {% csrf_token %} <!-- 帳號 --> <div class="form-group col-md-4"> <label for="username">暱稱</label> <input type="text" class="form-control" id="username" name="username" required> </div> <!-- 郵箱 --> <div class="form-group col-md-4"> <label for="email">Email</label> <input type="text" class="form-control" id="email" name="email"> </div> <!-- 密碼 --> <div class="form-group col-md-4"> <label for="password">設置密碼</label> <input type="password" class="form-control" id="password" name="password" required> </div> <!-- 確認密碼 --> <div class="form-group col-md-4"> <label for="password2">確認密碼</label> <input type="password" class="form-control" id="password2" name="password2" required> </div> <!-- 提交按鈕 --> <button type="submit" class="btn btn-primary">提交</button> </form> </div> </div> </div> {% endblock content %}
上面的模板文件中,咱們在暱稱、密碼input
標籤中添加了required
屬性(前面提到過)。若是用戶不填寫帶有required
屬性的字段,表單就不能提交,並提示用戶填寫。實際上前面學習的不少表單均可以添加required
屬性來提早驗證數據的有效性。
註冊的入口你能夠放在任何喜歡的地方。本文放在登陸頁面中/templates/userprofile/login.html
:
/templates/userprofile/login.html ... <div class="col-12"> <br> <h5>尚未帳號?</h5> <h5>點擊<a href='{% url "userprofile:register" %}'>註冊帳號</a>加入咱們吧!</h5> <br> <form method="post" action="."> ... </form> </div> ...
最後就是在app中配置路由文件/userprofile/urls.py
了:
/userprofile/urls.py ... urlpatterns = [ ... # 用戶註冊 path('register/', views.user_register, name='register'), ]
運行服務器,進入到登陸頁面,多了註冊的提示:
點擊註冊帳號進入註冊頁面:
填寫好表單後提交(Email地址是能夠爲空的):
成功登陸並返回了博客列表,功能完成。
本章用到了表單類、對數據進行驗證清洗等知識,完成了用戶的註冊功能。
接下來學習如何實現刪除已有的用戶。
轉載請告知做者並註明出處。