Django 模版语法

Posted Erick - LONG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 模版语法相关的知识,希望对你有一定的参考价值。

一.简介

模版是纯文本文件。它可以产生任何基于文本的的格式(html,XML,CSV等等)。

模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签

{% 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:"100" }}</p>
{% endfor %}
{% endblock %}

1.变量

{{ variable }}
{#如果后台 渲染传过来的是字典格式的数据 那么前端页面解析值 dict={"k1":"v1"} 假设传的是{"dict": dict} 前端页面取值 .字典key值#}
 
<h1>{{dict.k1}}</h1>

2.过滤器

  可以通过使用 过滤器来改变变量的显示

格式:

{{ name|lower }}

过滤器参数;

{{ item.content |truncatewords:30 }}  <!-- 只显示 content 变量的前30个词 -->

default

{{ value|default:"nothing" }}   <!--如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->

length

返回值的长度。它对字符串和列表都起作用

{{ value|length }}

filesizeformat

将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 \'13 KB\', \'4.1 MB\', \'102 bytes\', 等等)
{{ value|filesizeformat }}

add

把add后的参数加给value

{{ value|add:"2" }}  <!--如果 value 为 4,则会输出 6.-->

capfirst

将变量首字母变大写

{{ value|capfirst }}  <!--如果value是test过滤后转为Test-->

cut

移除value中所有的与给出的变量相同的字符串

{{ value|cut:" " }}

dictsort

根据指定的key值对列表字典排序,并返回

{{ value|dictsort:"name" }}
{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

如给定值为:

[
    {\'title\': \'1984\', \'author\': {\'name\': \'George\', \'age\': 45}},
    {\'title\': \'Timequake\', \'author\': {\'name\': \'Kurt\', \'age\': 75}},
    {\'title\': \'Alice\', \'author\': {\'name\': \'Lewis\', \'age\': 33}},
]

那么结果为:

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

random

随机返回一个值

{{ value|random }}
如果 value 是 列表 [\'a\', \'b\', \'c\', \'d\'], 可能输出的是 "b"

slice

切片

{{ some_list|slice:":2" }}

如果 some_list 是 [\'a\', \'b\', \'c\'], 输出结果为 [\'a\', \'b\']

 

truncatewords

字符串截断

{{ value|truncatewords:2 }}

如果 value 是 "Joel is slug",输出  "Joel is ...".

 

二.自动HTML转义

默认情况下,Django 中的每个模板会自动转义每个变量的输出。明确地说,下面五个字符被转义:

  • < 会转换为&lt;
  • > 会转换为&gt;
  • \' (单引号) 会转换为&#39;
  • " (双引号)会转换为 &quot;
  • & 会转换为 &amp;

如何关闭

要控制模板上的自动转义,将模板(或者模板中的特定区域)包裹在autoescape标签 中

{% autoescape off %}
    Hello {{ name }}
{% endautoescape %}

autoescape标签接受on 或者 off作为它的参数。有时你可能想在自动转义关闭的情况下强制使用它。下面是一个模板的示例:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
    This will not be auto-escaped: {{ data }}.

    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}

自动转义标签作用于扩展了当前模板的模板,以及通过 include 标签包含的模板,就像所有block标签那样。例如:

 

{% autoescape off %}
<h1>{% block title %}{% endblock %}</h1>
{% block content %}
{% endblock %}
{% endautoescape %}
{% extends "base.html" %}
{% block title %}This &amp; that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}

三.自定义simple_tag

自定义simple_tag

 

{% load humanize %}

{{ 45000|intcomma }}

load标签可以接受多个库名称,由空格分隔。例如

{% load humanize i18n %}

5.1 自定义标签代码

自定义模板标签和过滤器必须位于Django 的某个应用中。如果它们与某个已存在的应用相关,那么将其与应用绑在一起才有意义;否则,就应该创建一个新的应用来包含它。

这个应用应该包含一个templatetags 目录,和models.pyviews.py等文件处于同一级别目录下,如果目录不存在则创建它——不要忘记创建__init__.py 文件以使得该目录可以作为Python 的包。在添加这个模块以后,在模板里使用标签或过滤器之前你将需要重启服务器。新建 PY文件

切记:目录名一定要是templatetags

自定义simple_tag
在templatetags目录下的py文件中写:
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()
 
@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1 + v2 + v3

在HTML中写:

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
{% my_simple_time 1 2 3%}
 
</body>
</html>

自定义simple_tag的html中不能用于if条件作为判断,so引出了自定义过滤器函数

自定义过滤器函数

(最多俩个参数,html中可以有if条件语句)
自定义的过滤器就是一个带1,2个参数的python函数,一个参数放变量值,一个用来放选项值,比如{{ var|remove:"bar" }}, var是变量值,"bar"是选项值。
在templatetags目录下的py文件中写:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
 
@register.filter
def detail3(value,arg):
    allcount, remainder = arg.split(\',\')
    allcount = int(allcount)
    remainder = int(remainder)
    if value%allcount == remainder:
        return True
    return False

在HTML中写:

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
{{  23|detail4:"4,0" }}
 
{% if  23|detail4:"4,0" %}
<h1>123</h1>
{% endif %}
 
</body>
</html>

 

以上是关于Django 模版语法的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板层

Django模版系统

Django模版语言

Django 第三篇模版语音

django框架五

django框架五