一 注册页面的 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 %}
五 测试