首页 > 其他分享 >Django(2) - Django模板

Django(2) - Django模板

时间:2022-12-29 08:44:21浏览次数:60  
标签:DTL Django 引擎 Jinja2 过滤器 模板

1.Django模板介绍

基础概念

  • 模板是具有一定的格式或骨架,可以动态的生成HTML
  • 模板引擎决定以何种方式组织代码
  • 一个项目可以有一个或者是多个模板引擎,Django里面主要两个模板引擎:DTL、Jinja2。
  • Jinja2之前Flask笔记里面有,点击跳转https://www.cnblogs.com/gltou/p/16828437.html

 

DTL介绍

DTL是django原生的模板系统,Django1.8之前,Django框架只支持DTL。后面的版本可以兼容多个模板引擎了。

 

模板的好处

  • 增强代码的可阅读性
  • 增强代码的可维护性
  • 增加代码的可扩展性

 

关于DTL和Jinja2的区别以及谁更好,我简单找了两篇博客,一个是阐述DTL优于Jinja2,一个是阐述Jinja2优于DTL的。个中差异,如何选择,因项目而议,因熟练而议。本文主要讲解的是DTL的使用,下面的示例代码大家看的时候要注意。

 

2.Django模板相关配置

知识点

  • 掌握 settings.py中模板相关的配置
  • 了解 多个模板引擎支持情况下配置
  • 掌握 模板的加载顺序

 

settings.py文件templates属性相关配置

参数说明

  • BACKEND:模板引擎配置,目前Django支持以下两个模板引擎,即DTL和Jinja2
    • 默认是DTLdjango.template.backends.django.DjangoTemplates
    • 也可以配置成Jinja2django.template.backends.jinja2.Jinja2
  • DIRS:模板引擎按列表顺序搜索这些目录以查找模板源文件。每种模板引擎后端都定义了一个惯用名称作为应用内部存放模板的子目录名称。
    • DTL:templates目录
    • Jinja2:jinja2目录
  • APP_DIRS:决定模板引擎是否应该进入每个已安装的应用(即模块)中查找模板。改为True允许进入查找时,还需要在settings.py文件中将应用名称(即模块名称)追加到INSTALLED_APPS 属性中。

  • OPTIONS:其他选项配置

 

如果需要同时支持两种模板引擎,应该怎么修改配置文件呢?

注意,配置文件添加好之后,要安装jinja2,因为django没有自带jinja2

存在两种模板引擎,两个模板引擎对应的目录下都有index.html,访问哪个呢?

模板文件的查找规则get_template('index.html'),根据TEMPLATES添加的模板引擎先后顺序进行查找。当遍历完位置在第一个的模板引擎目录以及已安装应用(模块中)对应的目录,找不到,才回去下一个配置的模板引擎中查找对应的html文件。实际工作项目中,当同时存在两个模板引擎时,除了将模板HTML放到两个引擎对应的目录下面。在HTML模板文件命名会以模板引擎不同做标记区分,避免同名文件。

小结一下模板查找的顺序:按添加顺序查找,先根目录后模块目录

 

 

3.Django模板的使用

3.1.模板变量的使用

知识点

  • 掌握 模板语法
  • 掌握 Python中简单数据类型的渲染
  • 掌握 Python中复杂数据类型的渲染
  • 掌握 DTL与Jinja2的使用区别

 

渲染Python中的变量

将变量以字典类型传入到render函数中,模板通过{{变量名}}识别

渲染静态图片

疑问:我图片明明是放在medias目录里面的,为什么配置图片路径的时候是在media路径下?

这个上一篇笔记里面有讲解,访问本地静态文件,我们配置的路由寻址是在media路径下开头,任意结尾。通过正则匹配路径,路径没有问题,就会到MEDIA_ROOT配置的目录下去寻找对应的文件

渲染Python中的对象

DTL与Jinja2的使用区别

  •  注意:变量名称中不能有空格或标点符号
  • 下面的语法在DTL中不被支持
    •  {{ object["a.b"] }} 
    •  {{ object["a b"] }} 

 

  • 类中的成员方法调用不需要(),也不支持参数传递

 

 思考:Django模板引擎DTL的for循环和Jinja2有哪些不一样呢?

 

3.2.模板标签的使用

知识点

  • 了解 模板标签的作用
  • 掌握 常用的模板标签
  • 掌握 DTL和Jinja2的使用区别

 

模板标签是什么?

使用变量时有哪些不方便的地方:

  • list/tuple如果没有循环标签,肯定很难办
  • 如果能加上if等条件判断就好了
  • 页面较多,如果能共用部分页面就好了
  • ...........

 

模板标签的使用

和Jinja2差不多,语法: {% tag %} ,有一些标签有开始也需要有结束。

 

常用的模板标签

主要有7类

  • 循环控制
  • 条件控制
  • 模板注释
  • URL解析
  • with语句块
  • 当前时间显示
  • 继承与包含(单独作为一个点阐述)

 

3.2.1.循环控制

语法参考

循环内自带的变量forloop

除了可以循环list和tuple,它还能循环dict

还支持重复循环(循环中再循环),通过 cycle 实现

DTL的for循环与Jinja2的区别

  • 循环变量DTL中为forloop,Jinja2中为loop
  • 当list为空时:DTL通过 {% empty %} 处理,Jinja2中为 {% else %} 
  • 循环中的再循环
    • DTL: {% cycle 'odd' 'even' %} 
    • Jinja2: {{ loop.cycle('odd','even') }} 
  • DTL不支持continue和break

 

示例代码

 

3.2.2.条件控制

语法参考

 

3.2.3.模板注释

基本和Jinja2是一致的,{# 注释 #}和{% comment %}的注释查看网页源代码是看不到的,而HTML的注释<!--注释-->通过网页源代码是可以看到的。

 

3.2.4.URL解析

URL标签的使用:通过路由名称逆向解析到对应的URL

static静态文件URL解析:

前置需知:首先在settings文件中设置下STATIC_URL这个属性,这个属性的意思就是静态文件访问的url路径,你改成什么,访问的时候就访问什么地址。添加STATICFILES_DIRS属性,这个属性就是你静态文件在项目下的路径。

上述命令是如何访问到静态文件的呢?简单讲下:{% static "图片名称" %}这个命令会根据你配置的STATICFILES_DIRS的目录,去这个目录里面查找图片。找到图片后,再根据你配置的STATIC_URL,将图片的URL传递给img便签的src属性。通过static标签找到图片后,需要通过{% load static %}对static进行解析展示。

DTL的URL解析与Jinja2的区别:

  • DTL:模板中使用 {% url 'url_name' params %} ,视图中使用reverse()函数进行url解析
  • Jinja2: {{ url_for('index') }} 

 

3.2.5.with语句块

这个基本上是和Jinja2是一样的。实现块级作用域,块级里面的变量和一些方法,只在with这个代码块中有效果。

 

3.2.6.当前时间显示

注意,图示的时间表示是规定格式,大小写代表不同的涵义不能乱改。详见官方文档:https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#std:templatefilter-date

 

 

3.2.7.小结:DTL模板标签和Jinja的使用区别

DTL与Jinja2大同小异,注意使用区别,主要集中在两个地方:

  • 区别一:循环中的区别
  • 区别二:URL解析的区别

 

3.3.模板的继承和包含

知识点

  • 了解 模板抽象和继承的使用场景
  • 掌握 相关的几个标签
  • 掌握 DTL与Jinja2的使用区别

 

使用场景:

  • 每个页面都引用了公共的头部,js,css
  • 有几个页面结构和内容及其相似(如:导航菜单)

 

3.3.1.模板的抽象和继承

将模板差异化(个性化)的代码使用{% block  名称 %}抽出来,使用{% extends %}继承模板代码。接着使用{% block 可变名称 %}对差异化代码重写,不重写,子模版会直接使用父模板的内容。如果想要复用差异化代码,使用{{ block.supper }}

注意:继承父模板时,extends语句得放在最前面,不然没有效果。

3.3.2.模板的包含

部分组件/功能/代码是大部分模板都需要用到的,怎么做呢?将这部分内容单独用一个html文件存放,使用{% include %}调用。

3.4.模板过滤器

知识点

  • 了解 过滤器的作用
  • 掌握 过滤器的使用
  • 掌握 Django中常用的过滤器
  • 掌握 DTL与Jinja2的使用区别

 

过滤器的作用:对变量进行特殊处理后再进行渲染展示,比如将英语单词转换成大写。

 

过滤器的语法

内置过滤器

日期/时间格式化选项传送门

safe:将HTML转成普通字符串

如果传递过来的参数不是HTML格式的使用truncatechars截取,如果是HTML格式的使用truncatechars_html截取

备注:过滤器可以多个追加同时使用,方法和Jinja2一致,通过“ | ”追加对变量处理的过滤器

与Jinja2的区别

最大的区别就是过滤器的传参,DTL通过冒好,Jinja2是括号

3.5.自定义过滤器

 知识点

  • 了解 自定义过滤器的使用场景
  • 掌握 Django中如何自定义过滤器
  • 了解 与Flask中自定义过滤器的区别

 

使用场景:Django自带的过滤器不满足我们的业务需求,对变量做较为复杂的处理,而后进行展示

 

自定义过滤器

新建的包只能叫这个名称:templatetags,在模块的目录下新建。新建的必须得是包,而不是文件夹,包可以被引入使用。编写过滤器的文件名没有强制要求

使用装饰器注册时,name不传默认就是函数的名称

注意事项:

  • 添加自定义过滤器后记得重启开发服务器
  • 自定义过滤器所在的模块需要添加到settings.py中的INSTALLED_APPS内

示例

 

标签:DTL,Django,引擎,Jinja2,过滤器,模板
From: https://www.cnblogs.com/gltou/p/17008892.html

相关文章

  • django中间件
    目录django中间件中间件简介自定义中间件(重要)中间件的顺序django中间件两个基本方法django中间件三个了解得方法基于django中间件的功能设计django中间件中间件简介1.流......
  • django查询中values_list(flat=True) 是什么意思?
    1.values()departments=models.Department.objects.filter(dpm_status=1).values('dnp__name')print(departments)# queryset中是一个个字典。“departments......
  • django 自带auth模块 实现 用户 注册、登录、验证、注销
    Auth模块只要是跟用户相关的登陆、注册、校验、修改密码、注销、验证用户是否登陆 内容详细Auth模块"""其实我们在创建好一个django项目之后直接执行数据库迁移......
  • LaTeX简易教程 | 02 LaTeX模板下载与结构详解
    导读LaTeX是我们科研过程中,非常重要的编写论文的工具。掌握LaTeX的基本用法,是科研人员必备的技能。学LaTeX的过程中,遇到很多坑,总结一下,写一份简易教程,方便大家入门LaTeX并能......
  • django csrf跨站,CBV添加装饰器,auth认证模块
    djangocsrf跨站,CBV添加装饰器,auth认证模块内容概要csrf跨站请求伪造csrf相关校验策略CBV添加装饰器的多种方式auth认证模块BBS项目需求分析内容详情csrf跨站请求......
  • VSCode使用技巧快速生成HTML模板
    本章目录:-前言简述-自定义HTML模板前言简述描述,我们在使用vscode时,新建的html文件是什么内容都没有的空文件,每次新建之后我们都要写那一坨一模一样的固定结构的标签。那有......
  • 1006.Django模型基础01
    一、Django的ORM简介1.ORM概念:对象关系映射(ObjectRelationalMapping);2.ORM优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。 django模型映射关系模型......
  • django 11 django中间件
    今日内容详细目录今日内容详细django中间件三个了解的方法基于django中间件实现功能的插拔式设计cookie与session简介django操作cookiedjango操作sessiondjango中间件三......
  • django 12 csrf跨站请求伪造
    今日内容详细目录今日内容详细csrf跨站请求伪造csrf校验策略csrf相关装饰器auth认证模块auth认证相关模块及操作扩展auth_user表csrf跨站请求伪造钓鱼网站:模仿一个正规......
  • 模板引擎Jinja资料
    模板引擎Jinja资料说明githubhttps://github.com/pallets/jinja官方网站https://jinja.palletsprojects.com/......