学习笔记,仅供参考


文章目录

  • Django的框架模式
    • MTV模式
    • 模板Template
      • 什么是模板
      • 模板的配置
        • 创建一个新的项目
        • sittings.py文件
        • 添加路径
        • 编写模板
        • 加载模板
      • 模板的传参
        • 编写第二个模板
        • 使用loader加载模板并传参
        • 使用render直接加载模板并传参
      • 模板的变量
    • 举个例子

Django的框架模式

MTV模式

MTV模式MTV代表Model-Template-View(模型一模板一视图)模式。这种模式用于应用程序的分层开发

  • 作用

    • 降低模块的耦合度
  • MTV
    • M–模型层(Model)负责与数据库交互;
    • T–模板层(Template)负责生成 HTML,呈现内容到浏览器;
    • V–视图层(View)负责处理业务逻辑,负责接收请求、获取数据,返回结果;
  • 图示

模板Template

什么是模板

  • 模板是HTML页面,可以根据视图中传递的数据填充值相应的页面元素。
  • 模板层提供了一个对设计者友好的语法用于渲染向用户呈现的信息。

模板的配置

创建一个新的项目

为了方便演示,我们创建一个新项目mywebsite2:

在项目下创建一个模板文件夹templates(这个文件夹用于存放模板文件):

sittings.py文件

在settings.py中有一个TEMPLATES列表,我们可以在这个列表中对模板进行设定。比如:

BACKEND:指定模板的引擎
DIRS:指定保存模板的目录们
APP_DIRS:是否要在应用中搜索模板的版本
OPTIONS:有关模板的选项们

我们看一下settings.py

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'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',],},},
]

现在,我们开始配置模板!

添加路径

首先,我们把模板文件夹的路径添加到DIRS中:

'DIRS': [os.path.join(BASE_DIR, 'templates')],

其中BASE_DIR是全局变量,是当前项目的绝对路径。

编写模板

首先,我们在templates文件夹下,创建模板文件page1.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Template</title>
</head>
<body><h1>这是我的第一个模板</h1></body>
</html>

我们再创建一个views.py文件:

from django.http import HttpResponsedef page1_template(request):return HttpResponse("OK!")

在urls.py文件中,添加一个路由:

from django.contrib import admin
from django.urls import path
from django.urls import re_path
from . import viewsurlpatterns = [path('admin/', admin.site.urls),re_path(r'page1_template/$', views.page1_template),
]

这时,我们还没有加载模板,只是编写好了模板文件。

加载模板
  • 第一种加载模板的方式

在视图函数中,通过loader方法获取模板,再通过HttpResponse进行相响应。

views.py

from django.http import HttpResponse
#导入loader
from django.template import loaderdef page1_template(request):#通过loader加载模板t = loader.get_template("page1.html")#将t转换为字符串html = t.render()#响应return HttpResponse(html)

向http://127.0.0.1:8000/page1_template/发起请求:

  • 第二种加载模板的方式

使用render直接加载并响应模板

views.py:

def test_page1_template(request):from django.shortcuts import renderreturn render(request, "page1.html")

注意,这里的render方法,返回的依然是HttpResponse对象。

urls.py

urlpatterns = [path('admin/', admin.site.urls),re_path(r'test_page1_template/$', views.test_page1_template),
]

向http://127.0.0.1:8000/test_page1_template/发起请求:

模板的传参

模板传参是指把数据形成字典,传参给模板,由模板渲染来填充数据

编写第二个模板

为了方便之后的学习,我们再写一个模板文件page2.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Template</title>
</head>
<body><h1>这是我的第2个模板</h1><h2> 姓名:{{name}}</h2><h2>年龄:{{age}}</h2><!--模板填入数据的格式{{变量名}}--></body>
</html>

urls.py

urlpatterns = [path('admin/', admin.site.urls),re_path(r'test_page1_template/$', views.test_page1_template),re_path(r'page2_template/$', views.page2_template)
]
使用loader加载模板并传参

views.py

def page2_template(request):t = loader.get_template("page2.html")html = t.render({"name":"Huang","age":10})return HttpResponse(html)

注意,render方法中只接受字典形式的数据。

向http://127.0.0.1:8000/page2_template/发起请求:

使用render直接加载模板并传参

views.py

def page2_template(request):d = {"name":"Bai","age":11}  return render(request, "page2.html", d)

再次向http://127.0.0.1:8000/page2_template/发起请求:

模板的变量

  • 在模板中使用变量语法
{{变量名}}

后端中,必须将变量封装到字典中才允许传递到模板上,其中键必须是字符串,值可以是列表,字典,自定义对象等等:

dic = {"变量1":值1, "变量2":值2}

举个例子

page2.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Template</title>
</head>
<body><h1>这是我的第2个模板</h1><h2> 姓名:{{name}}</h2><h2>年龄:{{age}}</h2><h3>兴趣:{{hobby}}</h3><h3>第1个兴趣:{{hobby.0}}</h3><h3>朋友:{{friend.name}}</h3><h3>兔子:{{bunny.name}}</h3><h3>兔子说:{{bunny.speak}}</h3></body>
</html>

urls.py

from django.contrib import admin
from django.urls import path
from django.urls import re_path
from . import viewsurlpatterns = [path('admin/', admin.site.urls),re_path(r'page2_template/$', views.page2_template),
]

views.py

class Bunny:def __init__(self, name, age):self.name = nameself.age = agedef speak(self):string = self.name + "今年已经" + str(self.age) + "个月啦"return stringdef page2_template(request):d = {"name":"Ada","age":22,"hobby":["羽毛球", "Game", "看书"],"friend":{"name":"Wang", "age":23},"bunny":Bunny("Huang", 10)}return render(request, "page2.html", d)

向http://127.0.0.1:8000/page2_template/发起请求:

Django(part11)--MTV模式及模板相关推荐

  1. Django的MTV模式详解

    参考博客:https://www.cnblogs.com/yuanchenqi/articles/7629939.html 一.MVC模型 Web服务器开发领域里著名的MVC模式. 所谓MVC就是把W ...

  2. Django MTV模式解析

    转自:https://blog.csdn.net/acs713/article/details/40651457 在正式开始coding之前,我觉得有必要探讨下Django的MTV模式,理论和实践相结 ...

  3. 【Django】MTV(Django)模型

    MTV(Django)模型 MVC模型 MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视 ...

  4. Django的MTV架构

    1.谈一下流行的MVC 把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念被称为软件架构的 Model-View-Controller (MVC)模式. 在这个模式中, Model 代表数据存取层,V ...

  5. Python学习笔记:7.2.2 Django快速建站 - MTV模式

    前言:本文是学习网易微专业的<python全栈工程师 - Django快速建站>课程的笔记,欢迎学习交流.同时感谢老师们的精彩传授! 一.课程目标 了解MTV模式 重新设置项目的模板目录 ...

  6. 【Django框架设计模式】MVC模式与MTV模式区别

    在Django中的MTV模式是MVC模式的迁移,其中MTV模式中将MVC模式中的V(视图)= V(视图)+ T(模板). MVC设计模式 MVC,是模型(Model).视图(View).控制器(Con ...

  7. Django MTV模式

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

  8. 01 理解Django框架下MTV模式(1)

    1.概述 本系列是以Python为后端语言,Django为后端框架,介绍搭建网站的步骤与方法,所有内容纯为自己学习过程的理解.(注:本部分不涉及前端html/CSS/JS等方面的知识内容,如用到相应前 ...

  9. django 之MTV模型

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

最新文章

  1. 为什么交叉熵和KL散度在作为损失函数时是近似相等的
  2. std::shuffle-c++
  3. C语言数组作为传入参数
  4. HDU - 5874 Friends and Enemies(思维)
  5. python学多久能写东西的软件有哪些_怎么自学python,大概要多久?
  6. android聚焦时如何给控件加边框,edittext设置获得焦点时的边框颜色
  7. ini_set ini_get 可操作配置参数列表 设置默认编码等
  8. php unlink()函数使用
  9. 设置eclipse主题
  10. 【图像加密】基于Arnold置乱图像加密解密Matlab代码
  11. ASO|几个ASO优化方案解析(下)
  12. DataSourceClosedException: dataSource already closed
  13. 删除win10自带微软中文输入法
  14. 快播关闭服务器,你怎么看?
  15. R数据分析:跟随top期刊手把手教你做一个临床预测模型
  16. 三种css垂直居中方案
  17. mysql 不用斯芬克斯 全局模糊匹配 查询
  18. 用matlab模拟机械运动
  19. React 自定义表单实现
  20. 专访 | 数据库厂商都怕低价竞争?阿里云说并不可惧

热门文章

  1. ubuntu环境下一键切换python的virtualenv虚拟环境
  2. 机器学习(四)——SVM(2)
  3. Navcat:1251 client does not support ...问题
  4. java线程太多卡顿_性能优化之卡顿延迟
  5. mysql循环查到没数据库_【mysql】在for循环里使用多线程查询数据库
  6. Node+Vue实现对数据的增删改查
  7. 聊聊HystrixEventNotifier
  8. Java基础知识(二)之控制语句
  9. 如何正确的在一个循环中删除ArrayList中的元素。
  10. “奔三”了,程序员,你该怎么选择未来的路?