python学习第7天---django框架---视图补充

python学习第7天---django框架---视图补充

目录


内容

1、书籍管理添加登录模块

  在之前视图讲解项目-书籍管理系统中,进一步添加登录应用。

1.1、 新建登录应用-login

  • 命令:在命令行切换到项目book_manage_system目录下

      	python manage.py startapp login
    

1.2、 应用注册

  • 项目下settings.py:

      INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'book',  # book应用
      'login',  # 登录应用
    
      ]
    

1.3、 路由配置

  • 项目下urls.py:

      urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^book/', include('book.urls')),
      url(r'^login/', include('login.urls')),
      url(r'^', include('login.urls')),
      ]
    
  • login应用下的urls.py:

      from django.conf.urls import url
      from login import views
    
      urlpatterns = [
      	# 通过url函数设置url路要配置项
      	url(r'^index$', views.index),
      	url(r'^login$', views.login),
      	url(r'^register$', views.register),
      	url(r'^', views.index),  # 默认
      ]
    

1.4、 用户模型类

  • login应用下models.py:

      from django.db import models
    
    
      # Create your models here.
    
      class User(models.Model):
      	"""用户模型类"""
      	username = models.CharField(max_length=20)
      	password = models.CharField(max_length=32)
    
      	class Meta:
      		db_table = 'login_user'
    

1.5、数据迁移

  • 命令

      python manage.py makemigrations
      python manage.py migrate
    

1.6、视图

  • login应用下的views.py:

      from django.shortcuts import render
      from django.http import HttpResponse
      from login.models import User
    
    
      # Create your views here.
    
      def index(request):
      	"""书籍管理登录首页"""
      	return render(request, 'public/index.html')
    
    
      def login(request):
      	"""用户登录"""
      	# 1、判断请求方法
      	if request.method == "GET":
      		return render(request, 'login/login.html')
      	# 2、获取表单数据
      	username = request.POST.get('username')
      	password = request.POST.get('password')
      	# 3、用户名和密码校验
      	try:
      		user = User.objects.get(username=username)
      	except Exception:
      		# 3.1、用户名不匹配
      		return render(request, 'login/login.html')
      	else:
      		if user.password != password:
      			# 3.2、密码不匹配
      			return render(request, 'login/login.html')
      		# 4、验证通过,进入书籍管理首页
      		return render(request, 'book/index.html')
    
    
      def register(request):
      	"""用户注册"""
      	# 1、判断请求方法
      	if request.method == 'GET':
      		# 1.1、如果是GET方法返回注册页面
      		return render(request, 'login/register.html')
      	# 1.2、如果是POST方法,获取表单数据
      	username = request.POST.get('username')
      	password = request.POST.get('password')
      	# 3、用户名校验
      	try:
      		user = User.objects.get(username=username)
      	except Exception:
      		# 3.2、校验通过
      		# 3.2.1、用户表添加新用户
      		new_user = User()
      		new_user.username = username
      		new_user.password = password
      		new_user.save()
      		# 3.2.2、跳转登录页面
      		return render(request, 'login/login.html')
      	else:
      		if user:
      			# 3.1、校验不通过,返回注册页面
      			return render(request, 'login/register.html')
    

1.7、模板

  • 项目/templates/public

    • 公用首页:index.html

        <!DOCTYPE html>
        <html lang="en">
        <head>
        	<meta charset="UTF-8">
        	<title>Title</title>
        	<style>
        		.book {
        			width: 200px;
        			height: 100px;
        			margin: 0 auto;
        		}
      
        		li {
        			color: green;
        		}
        	</style>
      
      
        </head>
        <body>
        <div class="book">
        	<h3 style="color: orange">书籍管理用户登录</h3>
        	<hr>
        	<a href="http://127.0.0.1:8000/login/login">登录</a>
        	<a href="http://127.0.0.1:8000/login/register">注册</a>
        </div>
        </body>
        </html>
      
  • 项目/templates/login:

    • login.html

        <!DOCTYPE html>
        <html lang="en">
        <head>
        	<meta charset="UTF-8">
        	<title>Title</title>
        	<style>
        		.login {
        			width: 300px;
        			height: 200px;
        			border: 1px solid black;
        			margin: 100px auto;
        			text-align: center;
        		}
        	</style>
        </head>
        <body>
        <div class="login">
        	<h3>书籍管理用户登录</h3>
        	<hr>
        	<form action="/login/login" method="post">
        		用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
        		密&emsp;码:<input type="password" name="password" placeholder="请输入密码"><br>
        		<input type="submit" value="登录">
        	</form>
        </div>
        </body>
        </html>
      
  • register.html:

      <!DOCTYPE html>
      <html lang="en">
      <head>
      	<meta charset="UTF-8">
      	<title>Title</title>
      	<style>
      		.login {
      			width: 300px;
      			height: 200px;
      			border: 1px solid black;
      			margin: 100px auto;
      			text-align: center;
      		}
      	</style>
      </head>
      <body>
      <div class="login">
      	<h3>书籍管理用户注册</h3>
      	<hr>
      	<form action="/login/register" method="post">
      		用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
      		密&emsp;码:<input type="password" name="password" placeholder="请输入密码"><br>
      		<input type="submit" value="注册"><br>
      	</form>
      </div>
      </body>
      </html>
    

1.8、效果展示

  • 项目结构:在这里插入图片描述

  • 首页:在这里插入图片描述

  • 注册:在这里插入图片描述

  • 登录:在这里插入图片描述

  • 数据表:在这里插入图片描述

2、ajax

  ajax知识,这里不再详述,给出参考地址:

3、登录案例ajax改进

  后端页面跳转的话,前端页面会整个页面刷新,造成资源浪费,用户体验差。AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

3.1、应用login下urls.py添加路由

	    url(r'^login_ajax$', views.login_ajax),

3.2、 应用login下views.py添加视图函数

	def login_ajax(request):
	"""用户登录"""
	# print(request)
	# 1、判断请求方法
	if request.method == "GET":
		return render(request, 'login/login-ajax.html')
	# 2、获取表单数据
	username = request.POST.get('username')
	password = request.POST.get('password')

	# 3、用户名和密码校验
	try:
		user = User.objects.get(username=username)
	except Exception:
		# 3.1、用户名不匹配
		return JsonResponse({
			'res': 0
		})
	else:
		if user.password != password:
			# 3.2、密码不匹配
			return JsonResponse({
				'res': 0
			})
		# 4、验证通过,进入书籍管理首页
		return JsonResponse({
			'res': 1
		})

3.3、 项目/templates/login/login-ajax.html

	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Title</title>
		<script src="/static/public/js/jquery.min.js"></script>
		<style>
			.login {
				width: 300px;
				height: 200px;
				border: 1px solid black;
				margin: 100px auto;
				text-align: center;
			}

			#errorMsg {
				display: none;
				color: red;
			}
		</style>
		<script>
			$(function () {
				$('#btnLogin').click(function () {
					// 1、获取用户名和密码
					let username = $('#username').val();
					let password = $('#password').val();
					// 2、发起ajax请求
					$.ajax({
						'url': '/login_ajax',
						'type': 'POST',
						'data': {'username': username, 'password': password},
						'dataType': 'json',
						success: function (data) {
							// console.log(data)
							if (data.res === 0) {
								$('#errorMsg').show().html('用户名或者密码错误');
							} else {
								location.href = '/book/index';
							}

						},
						error: function (data) {
							console.log(data)
						}
					});
				});
			});
		</script>
	</head>
	<body>
	<div class="login">
		<h3>书籍管理用户登录</h3>
		<hr>

		用户名:<input type="text" id="username" name="username" placeholder="请输入用户名"><br>
		密&emsp;码:<input type="password" id="password" name="password" placeholder="请输入密码"><br>
		<input type="button" id="btnLogin" value="登录"><br>
		<div id="errorMsg"></div>
	</div>

	</body>
	</html>

3.4、 效果图示

  • 失败:
    在这里插入图片描述

  • 成功:在这里插入图片描述

后记

  本项目为参考某音python系列视频。上面为自己参考写的学习笔记,持续更新。欢迎交流,本人QQ:806797785

  1. 原视频地址:https://space.bilibili.com/277754748?spm_id_from=333.788.b_765f7570696e666f.1
  2. 笔记项目源代码地址:https://gitee.com/gaogzhen/python
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值