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中处理字符串之isalpha()方法的使用
May 18 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
django定期执行任务(实例讲解)
Nov 03 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
python可视化实现代码
Jan 15 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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
递归列出所有文件和目录
2006/10/09 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python高效编程技巧
2013/01/07 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
OpenCV 模板匹配
2019/07/10 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
吸烟检讨书2000字
2014/02/13 职场文书
售后服务承诺书范文
2014/03/26 职场文书
学习作风建设心得体会
2014/10/22 职场文书
2014年纪委工作总结
2014/12/05 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
企业承诺书格式范文
2015/04/28 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
CSS预处理框架——Stylus
2021/04/21 HTML / CSS