Django模板语言

  首先模板只是一个文本文件,它可以生成任何基于文本的格式(HTML、XML、CSS等),模板中包含变量,在模板被渲染的时候替换为最终的值,以及控制模板逻辑的标签。

变量使用{{ 变量名 }}   , 逻辑运算使用 {% tag%}。

简单的基本模板代码:

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1> {% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"" }}</p>
{% endfor %}
{% endblock %}

Django 模板基本语法

一、变量

  变量看起来像这样:{{ variable}}.当模板引擎遇到变量时,会评估该变量并将其替换为最终的值。变量名由下划线、字母、数字组成。点(.)也出现在变量部分,但具有特殊的含义,使用点(.)来访问变量的属性。

当模板引擎遇到点(.)的时候,会按照以下顺序尝试查找:

字典的key
属性或者方法
数字索引

如果点(.)后是函数名,则不带参数调用它,并且省略括号,那么变量最终的结果是函数的返回值.

需要注意的是:字典中如果key名为‘items’,将会得到字典中item对应的值,而不是调用字典的.items()方法

获取变量的值demo:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板语言使用</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body> <p>
单个变量<span style="color: red;">{ { 变量值 } }</span>: {{ name }}
</p>
<hr> <p>
列表变量: {{ name_list }} <br>
列表可以使用索引的方式取值name_list.0\name_list.1: {{ name_list.0 }}<br>
列表可以使用索引的方式取值name_list.0\name_list.1: {{ name_list.1 }}<br>
</p>
<hr> <p>
字典变量: {{ name_dict }}<br>
字典变量通过.key进行访问name_dict.first_name: {{ name_dict.first_name }}<br>
字典变量通过.key进行访问name_dict.last_name: {{ name_dict.last_name }}<br>
字典是无序的,无法通过索引取值name_dict.0:{{ name_dict.0 }}<br>
</p>
<hr> <p>
传递一个对象 p1:{{ p1 }} <br>
传递一个对象 p2:{{ p2 }} <br>
p1 name: {{ p1.name }},p1 age:{{ p1.age }} <br>
p2 name: {{ p2.name }},p2 age:{{ p2.age }} <br>
</p>
<hr>
<p>
对象列表的方式: obj_list.0->p1 obj_list.0.name/age: <br>
p1 name: {{ obj_list.0.name }} <br>
p1 age: {{ obj_list.0.age }} <br>
</p> <hr style="color: red;"> </body>
</html>

单个变量、列表、字典、对象

二、标签

标签看起来想这样{% tag %}。首先标签比变量更复杂,一些执行逻辑判断、循环遍历等,还有一些将外部信息加载到模板中供以后的变量使用。一些标签需要开始标签和结束标签{% tag %} .... {% endtag %}。Django附带大约二十个内置模板标签。您可以在内置标签参考中阅读所有关于它们的内容。这里只介绍常用的标签:

for

循环播放数组中的每个项目。例如,要显示以下提供的运动员列表athlete_list

<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>

for ... empty

for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% empty %}
<li>空空如也</li>
{% endfor %}
</ul>

if,else,elif

评估一个变量,如果该变量为“true”,则显示该块的内容:

{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}

在上面,如果athlete_list不是空的,运动员的数量将被变量显示。否则,如果不为空,则会显示“运动员应该出局......”消息。如果两个列表都是空的,“没有运动员”。将被显示。

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}

三、Filter

使用Filter修改显示的变量。

过滤器看起来像这样:{value|filter:'...'}。value是要修改的变量,filter是过滤器函数,冒号(:)后是参数。Django提供了大约60个内置模板过滤器。您可以在内置的过滤器参考中阅读所有关于它们的内容。为了让您了解可用的功能,以下是一些更常用的模板过滤器:

defalue

如果变量为假或空,则使用给定的默认值。否则,使用变量的值。例如:

{{ value|default:"nothing" }}

如果value未提供或为空,则上面将显示“ nothing”。

length

返回值的长度。这适用于字符串和列表。例如:

{{ value|length }}

如果value是['a','b','c','d'],输出将是4。

filesizefamat

格式化为一个“人类可读”的文件大小的值(即, ,等等)。例如:'13 KB''4.1 MB''102 bytes'

{{ value|filesizeformat }}

如果value是123456789,输出将是。117.7 MB

再次,这些只是几个例子; 请参阅完整列表的内置过滤器参考

您也可以创建自己的自定义模板过滤器;

四、自定义Filter

1. 首先需要在APP目录下创建一个templates目录(包)

需要注意:

添加templatetags 模块后,您需要重新启动服务器,然后才能在模板中使用标签或过滤器。

2. 创建包含自定义标签和过滤器py文件:

polls/
__init__.py
models.py
templatetags/
__init__.py
poll_extras.py
views.py

在你的模板中,你可以使用如下的方式引入自定义标签和过滤器:

{% load poll_extras %}

3. 导入template

from django import template

4. 生成一个注册器,它是一个template.Library()实例

register = template.Libraty()

5. 编写自定义模板过滤器

# 编写一个不接受参数的自定义filter
def add_a(arg1):
return '{}_a'.format(arg1) # 编写一个接受参数的自定义filter
def add(arg1,arg2):
return '{}_{}'.format(arg1,arg2) '''
arg1 : 是必须的参数,接受管道符之前 要修改的value
arg2 : 是用户传过来的参数,filter冒号后
'''

6. 自测自定义过滤器

@register.filter(name='addA')  # 注册自定义过滤器
def add_a(arg1):
return '{}_a'.format(arg1) @register.filter(name='add') # 注册自定义过滤器
def add(arg1,arg2):
return '{}_{}'.format(arg1,arg2)

7. 使用自定义过滤器

1.在页面中首先导入{% load myfilter%}  #加载templates包下的自定义filter py文件
{% load myfilter %} 2. 使用
{{ ''|add_a }}
最终的结果是: 123a {{ ''|add:"abc" }}
最终的结果是: 123abc 3.需要重启服务器

五、simpletag

和自定义filter类似,只不过接收更灵活的参数。

定义注册simple tag

@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)

使用自定义simple tag

{% load app01_demo %}

{# simple tag #}
{% plus "1" "2" "abc" %}

六、inclusion_tag 返回一个HTML片段

多用于返回html代码片段

示例:

templatetags/my_inclusion.py

from django import template

register = template.Library()

@register.inclusion_tag('result.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}
 

templates/snippets/result.html

<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>

templates/index.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">
<title>inclusion_tag test</title>
</head>
<body> {% load inclusion_tag_test %} {% show_results 10 %}
</body>
</html>
 

Django-模板语言和过滤器的更多相关文章

  1. django “如何”系列4:如何编写自定义模板标签和过滤器

    django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...

  2. Django模板语言详解

    本节将介绍Django模版系统的语法.Django模版语言致力于在性能和简单性上取得平衡. 如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版 ...

  3. 10:django 模板语言

    Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一, django模板系统由模板,变量,过滤器,标签,注释等主要部分组成 模板 一个 ...

  4. Django模板语言,标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  5. Django模板语言 标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  6. 第三章:模版层 - 1:Django模板语言详解

    本节将介绍Django模版系统的语法.Django模版语言致力于在性能和简单性上取得平衡. 如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版 ...

  7. django 自定义标签和过滤器

    django 自定义标签和过滤器 Django支持自定义标签和过滤器.起初还不太重视它这项功能,但最近试了试自定义标签.发现django这个功能实在是太爽了. 首先在你项目的一个app中建立一个pyt ...

  8. 模板继承and自定义模板标签和过滤器

    自定义模板标签和 过滤器: 因为模板标签和过滤器只给我们提供了 这么多 无法对我们的使用造成更多的便利 ,剩下的就需要我们自己去创建新的 模板标签和过滤器了 1.在settings中的INSTALLE ...

  9. Django模板语言初识

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

随机推荐

  1. PHP-从零开始使用Solr搜索引擎服务(上)

    前言: 原文地址: http://www.cnblogs.com/JimmyBright/p/7156069.html 使用搜索引擎,我们常规的数据查询会快很多,还可以对关键词进行中文分词查询,返回一 ...

  2. VUE开发一个图片轮播的组件

    完成效果图如下: vue开发的思路主要是数据绑定,代码如下: <template> <div ref="root" style="user-select ...

  3. BZOJ3192:[JLOI2013]删除物品——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3192 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的 ...

  4. lumen 使用 dingo API 在 phpunit 中 404 的解决方法, 以及鉴权问题

    1. phpunit.xml 中添加 dingo 相关配置 <env name="API_STANDARDS_TREE" value="x"/> & ...

  5. 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量

    Prelude 好,HAOI2017终于会做一道题了! 传送到洛谷:→_→ 传送到LOJ:←_← 本篇博客链接:(●'◡'●) Solution 首先要读懂题. 考场上我是这样想的QAQ. 我们把每个 ...

  6. Java入门:基础算法之从字符串中找到重复的字符

    本程序演示从一个字符串中找出重复的字符,并显示重复字符的个数. import java.util.HashMap; import java.util.Map; import java.util.Set ...

  7. Docker login报错一例

    在一台ubuntu 18.04上执行docker login 登录镜像仓库的时候,抛出如下异常: error getting credentials - err: exit status 1, out ...

  8. 「Vue」实用组件

    一.时间格式 1.安装Moment模块 npm i moment -S2.main.js中设置全局过滤器 import moment from 'moment' Vue.filter('ctime', ...

  9. Cookie 基本操作

    Cookie 基本操作 对于 Cookie 得常用操作有,存取,读取,以及设置有效期:具体可以参照 JavaScript 操作 Cookie 一文:但,近期在前端编码方面,皆以Vue为冲锋利器,所以就 ...

  10. jquery中的$.each跳出循环并获取返回值

    jquery中使用each方法,类似于while或者for循环 一种退出循环的方式是:当数据全部被遍历完成,自然退出, 另一种方法是:当我们在循环中返回一个false时,会跳出循环 这里来使用第二种方 ...