django 模板语言

Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一,

django模板系统由模板,变量,过滤器,标签,注释等主要部分组成

模板

一个模板是一个简单的文本文件,它可以生成任何基于文本的格式,html,csv,xml等等

模板里面包含变量,过滤器,标签和注释,下面是一个简单的模板文件

{% 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 %}

变量

变量格式:{{ variable }}

变量解析:当模板引擎碰到一个变量的时候,会计算变量然后用结果去代替他

变量的命名:字母数字和下划线的组合,.(点号)不可用,因为点号有特殊的意义

如果变量不存在的时候,{{variable}}会被解析为‘‘(一个空字符串)

过滤器

修改变量的展示方式

格式:{{ variable|filter }},展示变量经过filter后的结果,例如{{ name|lower }}战术name的小写形式,|是管道

filter可以串联,例如{{ text|escape|linebreaks }}

filter可以有参数,用冒号表示,例如 {{ bio|truncatewords:30 }}

filter参数如果有空格,必须用引号括起来,例如:{{ list|join:", " }}

django有很多内建的过滤器,我们下一节再讲,因为有30个之多,足以成一节了

标签

标签比变量和过滤器要复杂的多,有些是在输出上产生内容,有些是控制文本流(通过循环和逻辑),还有一些是加载外部的一些内容进入模板

格式:{% tag %}

标签基本都是成对出现的,如:{% tag %} ... tag contents ... {% endtag %}

django内建的标签有很多,接近40个,足以成一节,下下节再说的

注释

注释,不用解释了吧

格式:{# #}

但是这个注释标签只能注释单行的文本

如果你想注释多行的话,要通过comment标签

模板继承

模板系统最有力也是最复杂的部分--模板继承,你可以在父模板中使用block标签定义一些列的变量,然后再字模板中覆盖他们,看下面的例子:

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

一个子模板如下,关键是extends标签

{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

渲染的效果如下:子模板中有的标签会覆盖父模板的内容如title,子模板没有覆盖的标签将从父模板哪里继承过来,如sidebar

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing blog</title>
</head>
<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>
    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>
        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

下面是一些tips:

  • 如果你要使用extends标签,请确保extends在子模板中时第一个标签
  • 在父模板中的block标签越多越好
  • 如果你在多个子模板中出现了重复的内容,是时候考虑把它们放到父模板里面了
  • {{ block.super }} 可以访问父模板中对应block的值,当你仅仅是想在父模板的基础上添加内容而不是覆盖的时候 ,可能会用到这个值

自动HTML转义

威胁主要来自跨站点攻击(XXS)

很明显,用户提交的内容是不能被盲目的信任的,因为一些别有用心的用户可能会利用这种盲目的信任来做一些你意想不到的事情,例如在内容中内嵌了一段javascript代码等等,所以django是默认自动转义的,即是有下面的转换

  • < is converted to &lt;
  • > is converted to &gt;
  •  (single quote) is converted to '
  • " (double quote) is converted to &quot;
  • & is converted to &amp;

如果你真的要放弃自动转义,或者你有自己的需要的,或者你确信用户的输入没有威胁的时候,你可以关闭自动HTML转义

在变量中,你可以这样做

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

在标签中,你可以这样做

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

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

访问方法调用

在模板中,大多数的方法调用还是可用的,但,方法是不可能在模板中定义的,所有的属性方法必须在模板之前定义好

{% for comment in task.comment_set.all %}
    {{ comment }}
{% endfor %}
{{ task.comment_set.all.count }}
# In model
class Task(models.Model):
    def foo(self):
        return "bar"

# In template
{{ task.foo }}

p

时间: 2024-12-29 12:39:15

django 模板语言的相关文章

Django模板语言小记

1.blog.views.py  # Create your views here. from django.template import loader,Context from django.http import HttpResponse from blog.models import BlogPost def archive(request):     posts = BlogPost.objects.all()     t = loader.get_template('archive.

Django模板语言

常用语法 {{  }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身. 变量 的命名包括任何字母数字以及下划线 ("_")的组合(不提倡数字开头). 变量名称中 不能有空格或标点符号. 点(.)在模板语言中有特殊的含义.当模版系统遇到点("."),它将以这样的顺序 查询: 字典查询(Dictionary lookup)

Django模板语言相关内容

Django模板系统 官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值. 几个例子: view中代码: def template_test(requ

Django(模板语言-自定义filter和simple_tag)

filter过滤器的主要形式:变量|函数,意思是将变量交给函数处理,而自定义filter就是自己定义函数,因为用到已有的很少. 1.在当前app中创建templatetags模块(包:带__init__.py)(必须的) 2.在templatetags中创建.py文件,如my_tags.py from django import template #因为要应用到前端模板语言,必须导入template from django.utils.safestring import mark_safe re

Django模板语言-Filters(过滤器)

Filters(过滤器) 在Django的模板语言中,通过使用 过滤器 来改变变量的显示. 过滤器的语法: {{ value|filter_name:参数 }} 使用管道符"|"来应用过滤器. 例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值.lower在这里的作用是将文本全都变成小写. 注意事项: 过滤器支持“链式”操作.即一个过滤器的输出作为另一个过滤器的输入. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }}

Django模板语言-Tags

Tags Tags # 普通for循环 <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul> for循环可用的一些参数: Variable Description forloop.counter 当前循环的索引值(从1开始) forloop.counter0 当前循环的索引值(从0开始) forloop.revcounter 当前循环的倒序索引值(从1开始)

Django 模板语言从后端传到前端

如果我们在后端有数据动态提取到前端的时候 就需要模板语言加以渲染后再将渲染好的HTML文件传入前端 我们的views.py里的index函数里有个s变量是个列表,将数据以大括号的形式传入{"list":s} 把s传入list. html的要加入的地方是用2个大括号引入的   <h1>{{ list.1 }}</h1> 用的是句点符获取列表第二个参数 和python的语法取得列表不同(list[1]) -------------------------------

Django模板语言(DTL)基础

## 模板变量 - 普通变量 {{ name }} - 对象变量(使用点号访问对象属性和方法,方法不加括号) {{ person.name }} ## 常用模板标签 # if标签,支持and,or,not和嵌套,不支持括号 {% if %}{% endif %} {% if %}{% elif %}...{% else %}{% endif %} # for标签,用法与Python中基本相同 {% for item in items %}{% endfor %} {% for item in i

4.Django模板语言和分页

继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} {% endblock %}</title> <link rel="stylesheet" href="