目录

前言:


一、介绍Django和MVT模式

Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。

使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

MVC 优势:

  • 低耦合
  • 开发快捷
  • 部署方便
  • 可重用性高
  • 维护成本低
  • ...

Python 加 Django 是快速开发、设计、部署网站的最佳组合。

特点

  • 强大的数据库功能
  • 自带强大的后台功能
  • 优雅的网址

MVC 与 MTV模型

MVC 模型

MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 以一种插件式的、松耦合的方式连接在一起。

  • 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • 视图(V)- 图形界面,负责与用户的交互(页面)。
  • 控制器(C)- 负责转发请求,对请求进行处理。

简易图:

用户操作流程图:


MTV 模型

Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:

  • M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • T 表示模板 (Template):负责如何把页面(html)展示给用户。
  • V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。

除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:

简易图:

用户操作流程图:

解析:

用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:

  • a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
  • b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。

视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

二、开发环境部署

以下都是讲在windows上的部署情况;

1、python3.10

2、vscode

3、安装Django模块

4、MySQL8.0

以上的安装就不讲了,比较简单,网上也有很多教程。都去官网下载安装即可。

三、项目搭建

3.1、前言:

学习django框架,就是学习了解它的文件目录,了解对应目录下的模块以及包,当然也可以在目录下再新建目录或模块和包。

1、首先新建一个Django项目,在其目录下cmd,然后在terminal下用指令

django-admin startproject 项目名称

来创建项目目录框架;接下来了解下这个框架里文件的作用。

3.2、数据库创建和连接配置

安装完MySQL 建好数据库

cmd窗口登录MySQL:`mysql -uroot -p `

安装python的pymysql包:`pip install pymysql`

创建数据库:`create DATABASE 数据库名称 DEFAULT CHARSET utf8;`

配置数据库:在setting.py 查找 DATABASES

3.3、Django模型定义

Django ORM

目录

一、介绍Django和MVT模式

特点

MVC 与 MTV模型

MVC 模型

MTV 模型

二、开发环境部署

三、项目搭建

3.1、前言:

3.2、数据库创建和连接配置

3.3、Django模型定义

Django ORM

3.4系统前端以及功能模块实现


Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

使用 ORM 的好处:

  • 提高开发效率。
  • 不同数据库可以平滑切换。

使用 ORM 的缺点:

  • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
  • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

ORM 解析过程:

  • 1、ORM 会将 Python 代码转成为 SQL 语句。
  • 2、SQL 语句通过 pymysql 传送到数据库服务端。
  • 3、在数据库中执行 SQL 语句并将结果返回。

ORM 对应关系表:

创建APP

python manage.py startapp app名称

然后将app配置到INSTALLED_APPS

models.py文件 定义模型 创建数据库表,编写数据库内容


from django.db import models# Create your models here.# 出版社类
class Publisher(models.Model):id = models.AutoField('序号', primary_key=True)name = models.CharField('名称', max_length=64)addr = models.CharField('地址', max_length=64)# 书籍的类
class Book(models.Model):id = models.AutoField('序号', primary_key=True)name = models.CharField('名称', max_length=64, null=True)ISBN = models.CharField('编号', max_length=64)translator = models.CharField('译者', max_length=64)date = models.DateField('出版日期', max_length=64,blank=True)publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)  # Django中创建外键联表操作# 作者的类
class Author(models.Model):id = models.AutoField('序号', primary_key=True)name = models.CharField('姓名', max_length=64)sex = models.CharField('性别', max_length=4)age = models.IntegerField('年龄', default=0)tel = models.CharField('联系方式', max_length=64)# 一个作者可以对应多本书,一本书也可以有多个作者,多对多,在数据库中创建第三张表book = models.ManyToManyField(to=Book)# 用户的类
class LmsUser(models.Model):id = models.AutoField('序号', primary_key=True)username = models.CharField('用户名', max_length=32)password = models.CharField('密码', max_length=32)email = models.EmailField('邮箱')mobile = models.CharField('手机', max_length=13)

3.4系统前端以及功能模块实现

新建成功工程后views.py文件里是空的,需要自己编写业务逻辑。

通过render模块把index.html这个文件返回到前端,并且返回给了前端一个变量form,在写html时可以调用这个form来展示list里的内容


import pytz
from django.db.models.fields import EmailField
from django.http import request, response
from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect, renderfrom myapp import models
from myapp.models import LmsUser# Create your views here.#出版社展示列表
def publisher_list(request):publisher = models.Publisher.objects.all()return render(request,'pub_list.html',{'pub_list' : publisher})#添加出版社
def add_publisher(request):if request.method == 'POST':new_publisher_name = request.POST.get('name')new_publisher_addr = request.POST.get('addr')models.Publisher.objects.create(name=new_publisher_name,addr=new_publisher_addr)return redirect('/pub_list/')return render(request,'pub_add.html')#编辑出版社
def edit_publisher(request):if request.method == 'POST':edit_id = request.GET.get('id')edit_obj = models.Publisher.objects.get(id=edit_id)new_name = request.POST.get('edit_name')new_addr = request.POST.get('edit_addr')edit_obj.name = new_nameedit_obj.addr = new_addredit_obj.save()return redirect('/pub_list/')edit_id = request.GET.get('id')edit_obj = models.Publisher.objects.get (id=edit_id)return render(request,'pub_edit.html',{'publisher':edit_obj})#删除出版社
def drop_publisher(request):drop_id = request.GET.get('id')drop_obj = models.Publisher.objects.get(id=drop_id)drop_obj.delete()data = {'ret':True,'msg':'删除成功!'} return redirect('/pub_list/')#作者列表
def author_list(request):author = models.Author.objects.all()return render(request,'auth_list.html',{'auth_list':author})#增加作者
def add_author(request):if request.method == 'POST':new_author_name = request.POST.get('name')new_author_sex = request.POST.get('sex')new_author_age = request.POST.get('age')new_author_tel = request.POST.get('tel')models.Author.objects.create(name=new_author_name,sex=new_author_sex,age=new_author_age,tel=new_author_tel)return redirect('/auth_list/')return render(request,'auth_add.html')#修改作者
def edit_author(request):if request.method == 'POST':edit_id = request.GET.get('id')edit_obj = models.Author.objects.get(id=edit_id)new_author_name = request.POST.get('edit_name')new_author_sex = request.POST.get('edit_sex')new_author_age = request.POST.get('edit_age')new_author_tel = request.POST.get('edit_tel')#new_book_id = request.POST.get('book_id')edit_obj.name = new_author_nameedit_obj.sex = new_author_sexedit_obj.age = new_author_ageedit_obj.tel = new_author_tel#edit_obj.book.set(new_book_id)edit_obj.save()return redirect('/auth_list/')edit_id = request.GET.get('id')edit_obj = models.Author.objects.get(id=edit_id)all_book = models.Book.objects.all()return render(request,'auth_edit.html',{'author':edit_obj,'book_list':all_book})
#删除作者
def drop_author(request):drop_id = request.GET.get('id')drop_obj = models.Author.objects.get(id=drop_id)drop_obj.delete() return redirect('/auth_list/')#书籍列表
def book_list(request):book = models.Book.objects.all()return render(request,'book_list.html',{'book_list':book})#添加书籍
def add_book(request):if request.method == 'POST':new_book_name = request.POST.get('name')new_book_ISBN = request.POST.get('ISBN')new_book_translator = request.POST.get('translator')new_book_date = request.POST.get('date')publisher_id = request.POST.get('publisher_id')models.Book.objects.create(name=new_book_name,publisher_id=publisher_id,ISBN=new_book_ISBN,translator=new_book_translator,date=new_book_date)return redirect('/book_list/')res = models.Publisher.objects.all()return render(request,'book_add.html',{'publisher_list':res})#编辑书籍
def edit_book(request):if request.method =='POST':new_book_name = request.POST.get('name')new_book_ISBN = request.POST.get('ISBN')new_book_translator = request.POST.get('translator')new_book_date = request.POST.get('date')new_publisher_id = request.POST.get('publisher_id')edit_id =request.GET.get('id')edit_obj = models.Book.objects.get(id=edit_id)edit_obj.name = new_book_nameedit_obj.ISBN = new_book_ISBNedit_obj.translator = new_book_translatoredit_obj.date = new_book_dateedit_obj.publisher_id = new_publisher_idedit_obj.save()return redirect('/book_list/')edit_id = request.GET.get('id')edit_obj = models.Book.objects.get(id=edit_id)all_publisher = models.Publisher.objects.all()return render(request,'book_edit.html',{'book':edit_obj,'publisher_list':all_publisher})#删除书籍
def drop_book(request):drop_id = request.GET.get('id')drop_obj = models.Book.objects.get(id=drop_id)drop_obj.delete()return redirect('/book_list/')#密码加密
def setPassword(password):"""加密密码 算法单次md5:parampassword:传入的密码:return:加密后的密码"""import hashlibmd5 = hashlib.md5()md5.update(password.encode())password = md5.hexdigest()return str(password)#用户注册
def register(request):if request.method == 'POST' and request.POST:data = request.POSTusername = data.get('username')email = data.get('email')password = data.get('password')mobile = data.get('mobile')LmsUser.objects.create(username=username,email=email,password=setPassword(password),#password=password,mobile=mobile,)return HttpResponseRedirect('/login/')return render(request,'register.html')#用户登录
def login(request):if request.method == 'POST' and request.POST:email = request.POST.get('email')password = request.POST.get('password')e = LmsUser.objects.filter(email= email).first()if e :now_password = setPassword(password)db_password = e.password if now_password == db_password:#return render(request,'pub_list.html)response = HttpResponseRedirect('/pub_list/')response.set_cookie('username',e.username)return responsereturn render(request,'login.html')

配置url路由

"""Library URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.conf.urls import include, url
from django.contrib import admin
from django.urls import path
from myapp import viewsurlpatterns = [path('admin/', admin.site.urls),url(r'^$',views.publisher_list),#出版社列表url(r'^pub_list/',views.publisher_list),#新增出版社url(r'^pub_add/',views.add_publisher),#编辑出版社url(r'^pub_edit/',views.edit_publisher),#删除出版社url(r'^pub_drop/',views.drop_publisher),#作者列表url(r'^auth_list/',views.author_list),#新增作者url(r'^auth_add/',views.add_author),#编辑作者url(r'^auth_edit/',views.edit_author),#删除作者url(r'^auth_drop/',views.drop_author),#图书展示url(r'^book_list/',views.book_list),#新增图书url(r'^book_add/',views.add_book),#编辑图书url(r'^book_edit/',views.edit_book),#删除图书url(r'^book_drop/',views.drop_book),#用户注册url(r'^signup',views.register),url(r'^register/',views.register),#用户登录url(r'^login/',views.login),]

运行server并访问

terminal下执行 python manage.py runserver   这样执行默认的路径是127.0.0.1:8080

指定端口或地址就再后面写上,如:python manage.py runserver 127.0.0.1:8888

然后浏览器访问http://127.0.0.1:8888

编辑html文件

新建成功工程后templates文件目录下是空的,我们需要在该目录下新建一个html文件来把内容展示到前端

首先是login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图书管理系统</title><link href="/static/css/jquery-ui.css" rel="stylesheet" media="screen"><!-- Bootstrap --><link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet"><!-- styles --><link href="/static/css/styles.css" rel="stylesheet"></head>
<body><div class="login-bg"><div class="header"><div class="container"><div class="row"><div class="col-md-12"><div class="logo"><h1><a href="index.html">图书管理系统</a></h1></div></div></div></div></div></div><div class="page-content"><div class="row"><div class="col-md-4 col-md-offset-4"><div class="login-wrapper"><div class="box"><h6>登录</h6><form  class="content-wrap" role="form" action="/login/" method="post">{% csrf_token %}<input type="text" class="form-control" name="email" placeholder="邮箱"><input type="text" class="form-control" name="password" placeholder="密码"><div class="action"><button class="btn btn-primary" type="submit">登录</button></div></form></div><div class="already"><p>没有账户?</p><a href="/register">注册</a></div></div></div></div></div><!-- jQuery (necessary for Bootstrap's JavaScript plugins) --><script src="/static/js/jquery.js"></script><!-- Include all compiled plugins (below), or include individual files as needed --><script src="/static/bootstrap/js/bootstrap.min.js"></script><script src="/static/js/custom.js"></script>
</body>
</html>

其余的源码放在GitHub里:https://github.com/Vincentsun89/Library/tree/master

到这里就完成了一个简单的网页制作的过程,有问题可以向我提问。

Python+Django 实现MVT页面相关推荐

  1. python django mysql web页面多级联动_Python Web实战:Python+Django+MySQL实现基于Web版的增删改查...

    前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...

  2. 特别编辑--windows+python+django实现前端页面上传到指定路径生成个性化二维码

    等你点蓝字关注都等出蜘蛛网了 坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. python-前端页面上传文件到指定 ...

  3. Python Django中,页面改变但链接地址没有跳转,解决方法

    预期是发送密码重置邮件后自动跳转到首页, 这个效果实现了,但是地址链接没有变,经过仔细定位, 解决方案如下: return render(request, 'login.html',{'msg': ' ...

  4. python django 动态网页_使用Django创建动态页面

    将 URL 映射到视图 那么概括起来,该视图函数返回了包含当前日期和时间的一段 HTML 页面.但是如何告诉 Django 使用这段代码呢?这就是 URLconfs 粉墨登场的地方了. URLconf ...

  5. [Python] Django框架入门

    说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...

  6. Python+django网页设计入门(17):模板语法及应用

    前导课程: Python+django网页设计入门(16):优化设计复用分页代码 Python+django网页设计入门(15):公用模板设计与使用 Python+django网页设计入门(14):使 ...

  7. 计算机毕业设计中Python Django 框架目录结构简介

    MVC架构 model 模型 用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是web程序中用于处理应用程序的数据逻辑部分,model是提供功能性的接口,通过这些接口可以获取model的功能 ...

  8. Django框架MVT模型工作流程

    Django 一.Django介绍 Django是一个开源的Web应用框架,由Python写成.采用了MTV的框架模式,它最初是被用来做CMS(内容管理系统)软件. 使用Django,程序员可以方便. ...

  9. 详细介绍MVC与Django的MVT模式

    Django 由python实现的,开源的,Web开发框架 起初被开发来用于管理劳伦斯日报(Lawrence Journal-World)旗下的新闻内容网站 2005年7月在BSD许可协议下发布 Dj ...

最新文章

  1. Ubuntu 17 安装sublime
  2. 教你打造一道超级防御的电脑防火墙
  3. 用ACE的Reactor模式实现网络通讯的例子
  4. 一个39岁程序员的应聘被拒
  5. 在Editplus中搭建Ruby开发环境
  6. oracle 超市管理系统,SuperManager 超市账单管理系统 JSP + Servlet + Oracle Jsp/ 240万源代码下载- www.pudn.com...
  7. PSPNet网络要点
  8. Java中遍历Set集合的三种方法
  9. [转]出租车中的MBA
  10. php提示Undefined index的解决方法
  11. 网站监控工具有哪些4款免费国内在线网站监控工具
  12. 浏览器插件FeHelper的学习:gulp基础、使用gulp构建项目
  13. python日志:去掉noteexpress导出参考文献题录的空格
  14. 24.FFmpeg学习笔记 - 用libavfilter转换原始音频格式1
  15. 计算机网络基本知识(二):网络拓扑结构
  16. 如何使用启动盘启动计算机,电脑重装系统怎么设置用U盘启动盘引导?
  17. The POODLE attack (SSLv3 supported) 漏洞修复
  18. ch340g电路图5v和3.3v供电电路
  19. The server cannot or will not process the request due to something that is perceived to be a client.
  20. ORACLE 10064诊断工具,TRCA安装与测试

热门文章

  1. 【岩熹攻略】明年中秋国庆同一天,2262年要过两个年?
  2. 拆解钉钉流程审批功能:卡片式配置的审批流是怎样设计的?
  3. Linux中配置uGet和aria2
  4. 银河麒麟Linux操作系统报错:U盘---只读文件系统
  5. 管网管理GIS服务平台有何功能?
  6. MeshSimplify
  7. 物联网时代的十大黄金定律,你造吗?
  8. Android完美实现录音笔记功能
  9. JS实现——体彩足球预测分析
  10. ElementUI表格选中多行改背景颜色