一.應用程序users
我們首先使用命令startapp來創建一個名爲users的應用程序。
1.將應用程序users添加到settings.py中
--snip--
INSTALLED_APPS = [
#我的應用程序
'learning_logs',
'users',
]
--snip--
2.包含應用程序users的URL
urls.py
from django.conf.urls import include,url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^users/',include('users.urls',namespace='users')),
url(r'',include('learning_logs.urls',namespace='learning_logs')),]
我們添加一行代碼,這行代碼與任何單詞users打頭的URL(如http://localhost:8000/users/login/)都匹配。
二、登錄網頁
在目錄learning_log/users中創建一個名爲urls.py的文件並添加如下代碼:
urls.py
"""爲應用程序users定義URL模式"""
from django.conf.urls import url
from django.contrib.auth.views import login
from . import views
urlpatterns=[
#登錄頁面
url(r'^login/$',login,{'template_name':'users/login.html'},
name='login'),]
我們首先導入默認視圖login,登陸頁面的URL模式與URL http://localhost:8000/users/login/匹配,在URL中單詞users讓Django在users/urls.py中查找,而單詞login讓它請求發送給Django默認視圖login。我們傳遞一個字典,告訴Django去哪裏查找我們將編寫的模板。
1.模板login.html
login.html
{% extends "learning_logs/base.html" %}
{% block content %}
{% if form.errors %}
<p>Your username and password didn't match.Please try again.</p>
{% endif %}
<form method="post" action="{% url 'users:login' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">log in</button>
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
</form>
{% endblock content %}
2.鏈接到登錄頁面
base.html
<p>
<a herf="{% url 'learning_logs:index'%}">Learning Log</a> -
<a herf="{% url 'learning_logs:topics'%}">Topics</a> -
{% if user.is_authenticated %}
Hello,{{ user.username }}.
{% else %}
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
在Django身份驗證系統中,每個模板都可使用users變量,這個變量有一個屬性is_authenticated:如果用戶已登錄,概述行爲True,否則爲False。
3.使用登錄頁面
訪問http:///localhost:8000/admin/,如果你任然是以管理員身份登陸的,在頁眉找到註銷連接並單擊,註銷後訪問 http://localhost:8000/users/login/,會看到類似下面的圖:
三、註銷
1.註銷URL
urls.py
urlpatterns=[
--snip--
#註銷
url(r'^logout/$',views.logout_view,name='logout'),]
2.視圖函數logout_view()
views.py
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import logout
def logout_view(request):
"""註銷用戶"""
logout(request)
return HttpResponseRedirect(reverse('learning_logs:index'))
3.鏈接到註銷視圖
base.html
--snip--
{% if user.is_authenticated %}
Hello,{{ user.username }}.
<a href="{% url 'users:logout' %}">log out</a>
{% else %}
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
包含個性化問候語和註銷鏈接的主頁:
四、註冊頁面
1.註冊頁面的URL模式
urls.py
urlpatterns=[
--snip--
#註冊頁面
url(r'^register/$',views.register,name='register'),]
這個模式與URL http://localhost:8000/users/register/匹配。
2.視圖函數register()
views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import logout,login,authenticate
from django.contrib.auth.forms import UserCreationForm
--snip--
def register(request):
"""註冊新用戶"""
if request.method!='POST':
#顯示空的註冊表單
form=UserCreationForm()
else:
#處理填寫好的表單
form=UserCreationForm(data=request.POST)
if form.is_valid():
new_user=form.save()
#讓用戶自動登錄,在重定向到主頁
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)
3.註冊模板
register.html
{% extends "learning_logs/base.html" %}
{% block content %}
<form method="post" action="{% url 'users:register' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">register</button>
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
</form>
{% endblock content %}
4.鏈接到註冊頁面
base.html
--snip--
{% if user.is_authenticated %}
Hello,{{ user.username }}.
<a href="{% url 'users:logout' %}">log out</a>
{% else %}
<a href="{% url 'users:register' %}">register</a> -
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}