案例:

实现登录注册功能。

注册:用户输入账号密码以后提交到服务器,服务器将账号密码保存到数据库中,然后重定向到登录页面。

登录:用户输入账号密码,服务器判断账号密码是否存在,如果存在的话登录成功转跳到主页面。

分析

需要3个页面、需要3个类视图(5个视图方法)。

注册类视图:

get视图方法:获取注册页面。

post视图方法:提交注册的账号密码,并且转跳到到登录页面。

登录类视图:

get视图方法:获取登录页面。

post视图方法:提交登录的账号密码,并且转跳到到主页面。

主页面类视图:

[表情] get视图方法:获取主页面。

1.django项目和应用创建命令

django-admin startproject 项目名
python manage.py startapp 子应用名
python manage.py runserver 运行项目

2.配置模板

在setting文件中配置模板

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','myapp',  # 注册子应用
]
TEMPLATES = [   {'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],# 模板配置'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 使用mysql数据库'HOST': 'localhost',  # 主机'PORT': 3306,  # 端口'USER': 'root',  # 用户名'PASSWORD': 'root',  # 密码,根据自己的密码来'NAME': 'game',  # 数据库}
}

安装数据库

在与项目同名的init.py文件中添加以下代码

import pymysql
pymysql.install_as_MySQLdb()

编写模型类

在子应用的models.py文件中编写代码

from django.db import modelsclass Users(models.Model):user = models.CharField(max_length=20,verbose_name='用户名')pwd = models.CharField(max_length=20,verbose_name='密码')

迁移

生成迁移文件:python .\manage.py makemigrations
执行迁移:python .\manage.py migrate

视图

在子应用的views.py文件中编写视图代码,来处理业务逻辑

from django.shortcuts import render,redirect
from django.views import View
from django.http import HttpResponse
from myapp.models import Users
# Create your views here.# 注册视图
class Register(View):# 返回注册页面def get(self,repuest):return render(repuest,'register.html')# 提交账号密码并保存的数据库def post(self,request):# 获取表单中的数据user1 = request.POST.get('user')pwd1 = request.POST.get('pwd')# 将账号密码保存的数据库中,可能出现异常,所以要进行异常处理try:Users.objects.create(user=user1,pwd=pwd1)except Exception as e:print(e)return HttpResponse('账号密码注册失败')# 重定向到登录页面return redirect('/login/')# 登录视图
class Login(View):# 返回登录页面def get(self,request):return render(request,'login.html')# 提交账号密码,验证账号密码是否存在def post(self,request):user1 = request.POST.get('user')pwd1 = request.POST.get('pwd')# 查看数据库中是否存在账号为user1的数据try:# 查询user_data = Users.objects.get(user=user1)except Exception as e:print(e)return HttpResponse('账号密码不存在')# 用户存在,判断密码是否一致if pwd1 == user_data.pwd:# 重定向到主页面return redirect('/main/')else:return HttpResponse('密码错误')# 主页面视图
class Main(View):# 获取主页面def get(self,request):return render(request,'main.html')

在templates文件下写与视图对应的模板页面

注册页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>注册页面</h3><form method="post" action="/register/">{% csrf_token %}账号:<input type="text" name="user">密码:<input type="password" name="pwd"><input type="submit" value="提交"></form>
</body>
</html>

登录页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>登录页面</h3><form method="post" action="/login/">{% csrf_token %}账号:<input type="text" name="user">密码:<input type="password" name="pwd"><input type="submit" value="登录"></form>
</body>
</html>

主页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>主页面</h3><br><table width="800" border="1" style="margin: 0 auto;"><tr><th>编号</th><th>用户名</th></tr>{% for i in show_user %}<tr><th>{{ i.id }}</th><th>{{ i.user }}</th></tr>{% endfor %}</table><br><br><br><br><br><table width="800" border="1" style="margin: 0 auto;"><tr><th>编号</th><th>书名</th><th>类型</th><th>价格</th><th>操作</th></tr>{% for i in show_books %}<tr><th>{{ i.id }}</th><th>{{ i.name }}</th><th>{{ i.kind }}</th><th>{{ i.price }}</th></tr>{% endfor %}</table>
</body>
</html>

路由

为了让视图生效,需要编写路由代码
我们可以采用路由分发,在创建的app中新建一个urls.py文件

from django.contrib import admin
from django.urls import path
from myapp import viewsurlpatterns = [path('register/', views.Register.as_view()),path('login/', views.Login.as_view()),path('main/', views.Main.as_view()),
]

在与项目同名的urls.py

from django.contrib import admin
from django.urls import path,include
from myapp import urlsurlpatterns = [path('admin/', admin.site.urls),path('',include(urls))
]

静态路由(GET参数)

127.0.0.1:8000/article/?page=1

127.0.0.1:8000/article/?page=2

127.0.0.1:8000/article/?page=3

动态路由

127.0.0.1:8000/article/1/

127.0.0.1:8000/article/2/

127.0.0.1:8000/article/3/

上下两种的区别:

  • 动态路由传参,参数需要参与路由匹配,在路由匹配中获取参数
  • GET参数,参数部分不需要参与路由匹配,在视图中提取参数

动态路由案例:

# 路由配置
from django.urls import path,re_path
from users import views
urlpatterns = [# 动态路由path('article/<str:page>/', views.ArticleView),path('<int:x>/<str:y>/', views.Index),re_path(r'^(?P<aaa>\d+)/$', views.Index2)
]# 视图代码
def ArticleView(request, page):print(type(page))return HttpResponse(f"这是第{page}页")def Index(request, x, y):return HttpResponse(f"x:{x},y:{y}")def Index2(request, aaa):return HttpResponse(f"正则表达式路由,aaa:{aaa}")

路由分发:

1.在子应用的文件夹下创建一个urls.py文件,将子路由的代码放在该文件中。

from django.urls import path,re_path
from users import views
# 子应用下的子路由
urlpatterns = [# 静态路由path('register/', views.RegisterView.as_view()),path('login/', views.LoginView.as_view()),path('index/', views.IndexView.as_view()),# 动态路由path('article/<str:page>/', views.ArticleView),path('<int:x>/<str:y>/', views.Index),re_path(r'^(?P<aaa>\d+)/$', views.Index2)
]

2.主路由进行路由分发。

from django.contrib import admin
from django.urls import path,include
# 导入子路由
from users import urls
# 主路由
urlpatterns = [path('admin/', admin.site.urls),# 路由分发path('', include(urls)),
]

删除操作

在view视图里

class DelBookView(View):def get(self,request,id):Books.objects.filter(id=id).delete()return redirect('/index/')

在模板页面里

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>主页面</h3><br><table width="800" border="1" style="margin: 0 auto;"><tr><th>编号</th><th>用户名</th></tr>{% for i in show_user %}<tr><th>{{ i.id }}</th><th>{{ i.user }}</th></tr>{% endfor %}</table><br><br><br><br><br><table width="800" border="1" style="margin: 0 auto;"><tr><th>编号</th><th>书名</th><th>类型</th><th>价格</th><th>操作</th></tr>{% for i in show_books %}<tr><th>{{ i.id }}</th><th>{{ i.name }}</th><th>{{ i.kind }}</th><th>{{ i.price }}</th># 删除<th><a href="/del/{{ i.id }}/" style="text-decoration: none">删除</a></th></tr>{% endfor %}</table>
</body>
</html>

P3 元宝第三天的笔记相关推荐

  1. C++ Primer 第三版 读书笔记

    1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...

  2. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  3. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  4. 鸟哥私房菜(基础篇第三版)笔记

    鸟哥私房菜(基础篇第三版)笔记 Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,centos5支持EXT3,6已经支持EXT4了. 文件系统包括以下三部分: 1:superbl ...

  5. 西瓜书第三章阅读笔记

    西瓜书第三章阅读笔记 第三章 线性模型 1.机器学习三要素 2.基本形式 3.线性回归 3.1 模型 3.2 策略 3.3 求解算法 4.对数几率回归 4.1 模型 4.2 策略 4.3 求解算法 5 ...

  6. 工程伦理第三章学习笔记2020最新

    工程伦理第三章学习笔记2020最新 因为之前自己在网上找答案总是觉得费劲,一道一道的找,很慢,突然找到了前两章的答案,感觉有一种前人种树后人乘凉的感觉,于是自己在艰难找完第三章习题并全对的情况下,将题 ...

  7. 多维随机变量及其分布——《概率论及其数理统计》第三章学习笔记

    多维随机变量及其分布--<概率论及其数理统计>第三章学习笔记 文章目录 多维随机变量及其分布--<概率论及其数理统计>第三章学习笔记 前言 MindMap 二维随机变量 定义与 ...

  8. 周志华西瓜书第三章学习笔记

    第三章学习笔记 文章目录 第三章学习笔记 1.知识脉络 2.我的笔记 参考 1.知识脉络 2.我的笔记 这一章公式推导实在太多了,需要补充的推导过程也有很多,就不写电子档了.扩展公式推导和LDA部分补 ...

  9. 精通CSS高级WEB标准解决方案(第三版)笔记

    精通CSS高级WEB标准解决方案(第三版)笔记 1 CSS选择符 1.1 类型选择符 1.2 ID选择符 1.3 类选择符 1.4 后代选择符 1.5 子选择符 1.6 相邻同辈选择符 1.6 一般同 ...

最新文章

  1. boot数据加解密 spring_SpringBoot 集成 Jasypt 对数据库加密以及踩坑
  2. 看2021年2月苏州各区新房均价,谈一点个人的思考
  3. 尚硅谷Java视频教程导航(学习路线图)
  4. 【干货】移动互联网时代的零售店面转型之道
  5. 【Qt】QModbusExceptionResponse类
  6. lingo编程的主要方法_java并发编程 --并发问题的根源及主要解决方法
  7. Dev C++详细配置
  8. 澳大利亚新南威尔士大学 巩东博士 招收若干名计算机视觉和机器学习方向PhD...
  9. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?
  10. ubuntu安装python3.8_在Ubuntu 18.04系统上安装Python 3.8的两种方法
  11. 三菱PlC程序大型项目QCPU+QD77MS16 包含一套完整的电气开发系统资料
  12. 2013Esri全球用户大会QA之GIS发展状况和趋势
  13. fences卸载_WIN10专业版彻底删除fences的技巧
  14. 地面控制点的作用_地下室人防预留预埋施工要点及控制点
  15. html固定按钮相对位置,css固定定位和绝对定位的区别是什么?
  16. Windows7 内部版本7601 此Windows副本不是正版
  17. J2SDK1.5-J2SDK5.0,哈哈
  18. Xshell——连接服务器
  19. C语言 || 递归 || 求第n个人的年龄
  20. java特种兵读书笔记(3-5)——java程序员的OS之OOM

热门文章

  1. 1114 计算营业额
  2. php判断无理数,如何快速判断一个数的开方是不是无理数?
  3. 重装Windows10后调节亮度无效,一直是最亮
  4. 计算机组成原理文华学院,华中科技大学文华学院计算机组成原理课设(11页)-原创力文档...
  5. 智慧农业系统开发功能有哪些?
  6. 如何将普通相机改成VR相机
  7. Unity摄像机对象锁定旋转运镜模拟
  8. 1.3双摇杆遥控器电路部分--基本外设电路(ST-link下载、串口、按键、摇杆、电量检测、LED指示灯、0.96寸OLED、NRF24L01)
  9. Linux pv显示进度条命令
  10. 观展指南|《星火·新生》沉浸式体验展倒计时1天