一 将应用程序users添加到settings.py中
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 我的应用程序
'learning_logs',
'users',
)
二 包含应用程序users的URL
# -*- coding: utf-8 -*-
from django.conf.urls import include, url
from django.contrib import admin
'''
这行代码与任何以单词 users 打头的 URL (如 http://localhost:8000/users/login/ )都匹配。
我们还创建了命名空间 'users' ,以便将应用程序 learning_logs 的 URL 同应用程序 users 的 URL 区分开来。
'''
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')),
]
三 登录页面
1 用户应用的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 中。
'''
urlpatterns = [
# 登录页面.
url(r'^login/$', login, {'template_name': 'users/login.html'},
name='login'),
]
2 登录模板
<!--一个应用程序中的模板可继承另一个应用程序中的模板。-->
{% extends "learning_logs/base.html" %}
{% block content %}
<!--如果表单的 errors 属性被设置,我们就显示一条错误消息,
指出输入的用户名 — 密码对与数据库中存储的任何用户名 — 密码对都不匹配。-->
{% if form.errors %}
<p>用户名和密码不匹配,请重试!</p>
{% endif %}
<!--让登录视图处理表单,因此将实参 action 设置为登录页面的 URL -->
<form method="post" action="{% url 'users:login' %}">
{% csrf_token %}
<!--登录视图将一个表单发送给模板,在模板中,我们显示这个表单-->
{{ form.as_p }}
<button name="submit">log in</button>
<!--我们包含了一个隐藏的表单元素 —— 'next' ,其中的实参 value 告诉 Django 在用户成功登录后将其重定向到什么地方
—— 在这里是主页-->
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
</form>
{% endblock content %}
3 链接到登录页面
<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 %}
四 登录测试