django框架模板语言使用方法详解


Posted in Python onJuly 18, 2019

本文实例讲述了django框架模板语言使用方法。分享给大家供大家参考,具体如下:

模板功能

作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑。模板不仅仅是一个html文件,还包括了页面中的模板语言。

  • 静态内容:css,js,html。
  • 动态内容:通过模板语言,动态生成一些网页内容

模板使用: 在视图函数中,使用模板产生html内容返回给客户端

方式一:

  1. 加载模板文件(loader.get_template)
  2. 模板渲染,产生标准的html页面内容(render)

通过HttpResponse对象,返回html界面内容给浏览器

def index(request):
  """进入首页"""
  context = {}  # 字典
  # 获取模板对象
  template = loader.get_template('index.html')
  # 渲染模板, 得到标准的html内容
  html_str = template.render(context, request)
  # 响应请求,返回html界面
  return HttpResponse(html_str)

方式二:

通过render()函数

def index(request):
  """进入首页"""
  context = {}  # 字典
  return render(request, 'index.html', context)

模板加载流程

Django会依次到以下目录查找模板文件,如果都找不到,则报错:

  1. 项目配置的模板目录
  2. admin应用的templates模板目录
  3. auth应用的templates模板目录

应用本身的templates模板目录

模板语言

DTL.(Django Template Language)简称: 模板语言

模板变量

格式: {{ 变量名 }}

模板变量名: 是由数字,字母,下划线组成,不能以下划线开头。

点(.) 也在会变量部分中出现, 点号(.)用来访问变量的属性。

当模版系统遇到点("."),它将以这样的顺序查询:

  • 字典查询(Dictionary lookup)
  • 属性或方法查询(Attribute or method lookup) (调用方法时不能传参)
  • 数字索引查询(Numeric index lookup)

如果模板变量不存在,则生成html内容时用 '' 空字符串代替。

例如: {{ book.btitle }}

1) 首先把book当成一个字典,把btitle当成键名,进行取值book['btitle']
2) 把book当成一个对象,把btitle当成属性或方法,进行取值

例如:{{ book.0 }}

1) 首先把book当成一个字典,把0当成键名,进行取值book['0']
2) 把book当成一个列表,把0当成下标,进行取值book[0]

模板标签

代码段

{% 代码段 %}

for 循环

遍历列表:

{% for x in 列表 %}
  列表不为空时执行
{% empty %}
  列表为空时执行
{% endfor %}

若加上关键字reversed则倒序遍历:

{% for x in 列表 reversed %}
{% endfor %}

遍历字典:

{% for key, value in my_dict.items %}
  {{ key }}: {{ value }}
{% endfor %}

可以通过 {{ forloop.counter }} 判断for循环执行到第几次,初始化值从1开始。

django框架模板语言使用方法详解

if 语句

{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}

关系比较操作符:

>    <     >=     <=     ==     !=

注意:进行比较操作时,比较操作符两边必须有空格。

逻辑运算:

not   and   or

过滤器

过滤器: 用于对模板变量进行操作,使用格式:

模板变量|过滤器:参数

一、内置过滤器

date: 改变日期的显示格式。

value|date:"Y年m月j日 H时i分s秒"

length: 求长度。字符串,列表,元组,字典长度

default: 设置模板变量的默认值。

data|default:'默认值'

二、自定义过滤器

需求: 实现两个自定义过滤器:

(1)判断是否奇偶
(2)求余操作

实现步骤:

  1. 创建包: 在应用下创建名字为templatetags的python包(名字固定)
  2. 创建模块: 在该templatetags下创建filters.py(名字随意取),该名字后面会使用到。

定义函数 自定义过滤器即带有一个或两个参数的python函数:

  • 参数1:模板变量
  • 参数2:参数,可选

装饰函数

  • 定义一个名字叫 register 的Library对象(名字固定)
  • 使用 @register.filter 对过滤器函数进行装饰

在模板界面中加载过滤器并使用: 在html中, 通过load标签导入自定义过滤器, 并使用:

模板注释

单行注释:

{# 注释内容 #}

多行注释:

{% comment %}
 注释内容
{% endcomment %}

模板继承

模板继承: 为了重用html页面内容

使用格式: {% extends 父模板文件路径 %}

块的使用:

在父模板里可以定义块:

{% block 块名 %}
  块中的内容(也可以没有)
{% endblock 块名%}

在子模板头部声明继承父模板:

{% extends 父模板文件路径 %}

示例:

{% extends "app01/parent.html" %}

在子模板中,重写父模板中的块(也可以不重写):

{% block 块名 %}
  {{ block.super}} #获取父模板中块的默认内容
  重写的内容
{% endblock 块名%}

Django中html转义

通过视图函数(render函数)传给模板的数据,如果含有特殊字符,默认是会转义的。

要关闭模板上下文字符串的转义:可以使用

{{ 模板变量|safe}}

也可以使用:

{% autoescape off %}
  模板语言代码
{% endautoescape %}

模板硬编码中的字符串默认不会转义,如果需要转义,那需要手动进行转义。

django框架模板语言使用方法详解

url反向解析

url逆向解析,反向解析

需求:当urls.py中的一个url配置项发生改变后,项目中所有硬编码引用该url链接的地方,都需要作修改。

解决方法:

给url配置项起个名字,在html界面中,再通过名字引用该url:

# project下的urls.py
urlpatterns = [
  ...
  url(r'^', include('app01.urls', namespace='应用名')),
]
# app01下的urls.py
urlpatterns = [
  ...
  url(r'^index$', views.index, name='url名称'),
]

在html界面中,通过url标签进行动态引用

{% url '应用名:url名称' %}
{% url '应用名:url名称' 位置参数1 位置参数2 %}
{% url '应用名:url名称' 关键字参数1 关键字参数2 %}

参考:

{% url 'app01:index' %}
{% url 'app01:show_news' 1 2 %}
{% url 'app01:show_news2' category=1 pageNo=2 %}

reverse函数

问题: 类似的,在python代码中,同样存在上面所说的url硬编码不方便维护的问题

# views.py
def url_reverse(request):
  # url正则配置项修改后,此处url硬编码代码需要修改
  return redirect("/index")
  # return redirect("/show_news/1/2")
  # return redirect("/show_news2/1/2")

解决:使用reverse函数,动态生成url。

# views.py
def url_reverse(request):
  # 动态引用
  # url = reverse("应用名:url名称")
  # url = reverse("应用名:url名称", args=[位置参数])
  # url = reverse("应用名:url名称", kwargs={关键字参数})
  return redirect(url)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python删除列表中重复记录的方法
Apr 28 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
基于python内置函数与匿名函数详解
Jan 09 Python
python对日志进行处理的实例代码
Oct 06 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Django框架 信号调度原理解析
Sep 04 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
使用python绘制二维图形示例
Nov 22 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
Django显示可视化图表的实践
May 10 Python
Django中间件基础用法详解
Jul 18 #Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 #Python
Django 实现图片上传和显示过程详解
Jul 18 #Python
Django框架模型简单介绍与使用分析
Jul 18 #Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 #Python
django 2.2和mysql使用的常见问题
Jul 18 #Python
详解Python二维数组与三维数组切片的方法
Jul 18 #Python
You might like
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
Java面试题及答案
2012/09/08 面试题
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
软件测试有哪些?什么是配置项?
2012/02/12 面试题
初中生三年学习生活的自我评价
2013/11/03 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
行政文员岗位职责
2015/02/04 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js
vue 给数组添加新对象并赋值
2022/04/20 Vue.js