1. 程式人生 > >Django專案——註冊功能

Django專案——註冊功能

一  註冊頁面的 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 %}

五 測試