Django專案——註冊功能
阿新 • • 發佈:2018-12-08
一 註冊頁面的 URL 模式
# -*- coding: utf-8 -*- from django.conf.urls import url # 匯入views中login from django.contrib.auth.views import login from . import views ''' 1 第一個url解析 登入頁面的 URL 模式與 URL http://localhost:8000/users/login/ 匹配。 這個 URL 中的單詞 users 讓 Django 在 users/urls.py 中查詢,而單詞login 讓它將請求傳送給 Django 預設檢視 login (注意,檢視實參為 login ,而不是 views.login )。 鑑於我們沒有編寫自己的檢視函式,我們傳遞了一個字典,告訴 Django去哪裡查詢我們將編寫的模板。 這個模板包含在應用程式 users 而不是 learning_logs 中。 2 第二個url解析 登出 URL 模式,該模式與 URL http://locallwst:8000/users/logout/ 匹配。 URL 模式將請求傳送給函式 logout_view() 。 這樣給這個函式命名,旨在將其與我們將在其中呼叫的函式 logout() 區分開來 3 第三個url解析 這個模式與 URL http://localhost:8000/users/register/ 匹配,並將請求傳送給我們即將編寫的函式 register() ''' urlpatterns = [ # 登入頁面. url(r'^login/$', login, {'template_name': 'users/login.html'}, name='login'), # 登出. url(r'^logout/$', views.logout_view, name='logout'), # 註冊頁面. url(r'^register/$', views.register, name='register'), ]
二 檢視函式 register
# -*- coding: utf-8 -*- ''' 我們首先匯入了函式 render() ,然後匯入了函式 login() 和 authenticate() , 以便在使用者正確地填寫了註冊資訊時讓其自動登入。我們還匯入了預設表單 UserCreationForm 。 ''' from django.shortcuts import render from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse # 從 django.contrib.auth 中匯入了函式 logout() from django.contrib.auth import login, logout, authenticate from django.contrib.auth.forms import UserCreationForm def logout_view(request): """ 登出使用者 """ # 呼叫了函式 logout() ,它要求將 request 物件作為實參。 logout(request) # 我們重定向到主頁 return HttpResponseRedirect(reverse('learning_logs:index')) def register(request): """在註冊頁面首次被請求時,檢視函式 register() 需要顯示一個空的登錄檔單, 並在使用者提交填寫好的登錄檔單時對其進行處理。 如果註冊成功,這個函式還需讓使用者自動登入。""" if request.method != 'POST': # 顯示空的登錄檔單. form = UserCreationForm() else: # 根據提交的資料建立一個 UserCreationForm 例項 form = UserCreationForm(data=request.POST) # 檢查這些資料是否有效:就這裡而言,是使用者名稱未包含非法字元,輸入的兩 # 個密碼相同,以及使用者沒有試圖做惡意的事情。 if form.is_valid(): # 表單的方法 save() ,將使用者名稱和密碼的雜湊值儲存到資料庫中 # 方法 save() 返回新建立的使用者物件,我們將其儲存在 new_user new_user = form.save() # L 讓使用者自動登入,再重定向到主頁 authenticated_user = authenticate(username=new_user.username, password=request.POST['password1']) login(request, authenticated_user) return HttpResponseRedirect(reverse('learning_logs:index')) context = {'form': form} return render(request, 'users/register.html', context)
三 註冊模板
{% extends "learning_logs/base.html" %} {% block content %} <!--這裡也使用了方法 as_p ,讓 Django 在表單中正確地顯示所有的欄位,包括錯誤訊息 —— 如果使用者沒有正確地填寫表單。--> <form method="post" action="{% url 'users:register' %}"> {% csrf_token %} {{ form.as_p }} <button name="submit">註冊</button> <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" /> </form> {% endblock content %}
四 連結到註冊頁面
<p>
<a href="{% url 'learning_logs:index' %}">學習筆記</a> -
<a href="{% url 'learning_logs:topics' %}">主題</a> -
<!--在 Django 身份驗證系統中,每個模板都可使用變數 user ,
這個變數有一個 is_authenticated 屬性:如果使用者已登入,
該屬性將為 True ,否則為 False 。-->
{% if user.is_authenticated %}
<!--對於已通過身份驗證的使用者,還設定了屬性 username ,
我們使用這個屬性來個性化問候語,讓使用者知道他已登入-->
你好, {{ user.username }}.
<!-- 使得僅當用戶登入後才能看到它-->
<a href="{% url 'users:logout' %}">退出</a>
{% else %}
<!--已登入的使用者看到的是個性化的問候語和登出連結,而未登入的使用者看到的是註冊連結和登入連結。-->
<a href="{% url 'users:register' %}">註冊</a> -
<a href="{% url 'users:login' %}">登入</a>
{% endif %}
</p>
{% block content %}{% endblock %}
五 測試