Django学习笔记5

登录页面
我们首先来实现登录页面的功能,将使用Django提供的默认登录视图函数,因此ULR模式会稍有些不同
在目录learning_log/users/中,新建一个名为users.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/匹配
视图参数是login,而不是views.login.这个URL中的单词users让Django在users/urls.py中查找,而单词
让它将请求发送给Django默认视图login.鉴于我们没有编写自己的视图函数,我们传递了一个字典,告诉Django
去哪里查找我们将编写的模板。这个模板包含在应用程序users中


模板login.html

{% extends "learning_logs/base.html" %}

{% block content %}
  
  {% if form.errors %}
  

Your username and password didn't match. Please try again.

{% endif %}
{% csrf_token %} {{ form.as_p }}
{% endblock content %}

在目录learning_log/users/中,创建一个名为templates的目录,并在其中创建一个名为users的目录

创建一个login.html

这个模板继承了base.html,注意一个应用程序中的模板可以继承另一个应用程序中的模板
如果表单的errors属性被设置,我们就显示一条错误信息,指出用户名和密码不匹配
我们要让登陆视图处理表单,因此将实参action设置为登录页面的URL
登录视图将一个表单发送给模板,在模板中,我们显示这个表单,并添加一个提交按钮。
最后我们包含了一个隐藏的表单元素'next',type="hidden"表示这是一个隐藏字段,对用户不可见。
value实参告诉Django在用户成功登陆后将其重定向到什么地方(这里是主页)


链接到登陆页面
在base.html中添加到登陆页面的链接,让所有页面都包含它。用户已登录时,我们想要不显示这个链接,可以嵌套在一个
{% if %}标签中
在Django身份验证系统中,每个模板都都可一种变量user.对于没有登陆的用户,我们实现一条登陆链接;对于登陆的链接,
我们现实一条问候语

learning Log - Topics - {% if user.is_authenticated %} Hello, {{user.username}}. {% else %} log in {% endif %}

{% block content %}{% endblock content %}

访问http://localhost:8000/admin/,退出管理员登录
然后访问http://lcoahost:8000/users/login/  并输入用户名和密码 点击log in提交

之后进入index主页面,显示了一条个性化问候语,其中包含你的用户名

Django学习笔记5_第1张图片

注销
需要提供一个让用户注销的途径。我们不创建用于注销的页面,而让用户只需要单击一个链接就能注销并返回到主页
。为此,我们将为注销链接定义一个URL模式,编写一个视图函数,并在base.html中添加一个注销链接


注销URL
该模式与URL http://localhost:8000/users/logout/匹配
修改users/urls.py
urls.py

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'),

	# 注销
	url(r'^logout/$', views.logout_view, name="logout"),
]
视图函数logout_view()
只是导入Django函数logout(),并调用它,再重定向到主页
打开users/views.py
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

def logout_view(request):
	"""注销用户"""
	logout(request) # 调用Django函数logout()
	# 重定向到主页
	return  HttpResponseRedirect(reverse('learning_logs:index'))

	
链接到注销视图

修改base.html 我们将注销链接放到{% if user.is_authenticated %}中,使得仅当用户登录后才能看见它

learning Log - Topics - {% if user.is_authenticated %} Hello, {{user.username}}. log out {% else %} log in {% endif %}

{% block content %}{% endblock content %}

输入http://localhost:8000/


注册页面
来创建一个让新用户能够注册的页面 我们将使用Django提供的表单UserCreationForm,但

编写自己的视图函数和模板


注册页面的URL模式

users/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'),

	# 注销
	url(r'^logout/$', views.logout_view, name="logout"),

	# 注册页面
	url(r'^register/$', views.register, name='register'),
]

这个模式与URLhttp:localhost:8000/users/register匹配,并将请求发送给我们即将编写的函数register()

视图函数register()

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)

在注册页面首次被请求时,视图函数register()需要显示一个空的注册表单,并在用户提交填写好的注册表单时对其进行处理。
如果注册车工,这个函数还需让用户自动登录。
如果相应的是POST请求,我们就根据提交的数据创建一个UserCreationForm实例,并检查这些数据是否有效(用户名是否包含非法字符,
输入的两个密码是否相同,以及是否SQL注入等恶意行为)
如果提交的数据有效,我们就调用表单的方法save(),将用户名和密码的散列值保存在数据并将实参new_user.username和密码传递给他
用户注册时,密码要输入两次,由于表单时有效的,因此可以使用任何一个authenticate()将返回一个通过了身份验证的用户对象
接下来,调用login()函数,并将对象request和authenticated_user传递给它,最后将重定向到主页,显示一条用户问候语


注册模板
在login.html同一目录中创建register.html
{% extends "learning_logs/base.html" %}

{% block content %}

  
{% csrf_token %} {{ form.as_p }}
{% endblock content %}
链接到注册页面
在用户没有登陆时显示到注册页面的链接

修改base.html

learning Log - Topics - {% if user.is_authenticated %} Hello, {{user.username}}. log out {% else %} register - log in {% endif %}

{% block content %}{% endblock content %}

Django学习笔记5_第2张图片

点击注册按钮,包含用户名和密码就会被检查是否合法,然后保存到数据库中,最后重定向到主页,并提示你已经登录

你可能感兴趣的:(Python,Django入门学习)