zoukankan      html  css  js  c++  java
  • Django模板

    在django中自带的是DTL( Django template language)模板。

    模板的配置settings.py

    
    TEMPLATES = [
    
    {
    
    'BACKEND': 'django.template.backends.django.DjangoTempla
    
    tes',
    
    'DIRS': [],
    
    'APP_DIRS': True,
    
    'OPTIONS': {
    
    },},]
    
    
    • 若想在 Python 代码中使用 Django 的模板系统,基本方式如下:

    1.以字符串形式提供原始的模板代码,创建 Template 对象。

    2.在 Template 对象上调用 render() 方法,传入一系列变量(上下文)。返回的是完全渲染模板后得到的字符串,模板中的变量和模板标签已经根据上下文求出值了。

    创建Template对象

    • 最简单的方式是直接实例化。 Template 类在 django.template 模块中,构造方法接受一个参数,即原始的模板代码。

    渲染模板

    • 有了 Template 对象之后,可以为其提供上下文,把数据传给它。上下文就是一系列模板变量和相应的值。模板使用上下文填充变量,求值标签。在 Django 中,上下文使用 django.template 模块中的 Context 类表示。它的构造方法接受一个可选参数:一个字典,把变量名映射到值上。

    • Django 模板系统的基本用法:编写模板字符串,创建 Template 对象,创建 Context 对象,然后调用 render() 方法。

    上下文变量查找

    • 遍历 Django 模板中复杂数据结构的关键是点号( . )。点号可以访问字典的键、属性、方法或对象的索引。假如我们把一个 Python 字典传给模板。若想通过键访问那个字典中的值,要使用点号。

    • 注意,方法调用中没有括号。此外,不能给方法传递变量,只能调用无需参数的方法。不允许使用负数索引。

    • 模板系统遇到变量名中的点号时会按照下述顺序尝试查找:

    • 字典查找(如 foo["bar"] )

    • 属性查找(如 foo.bar )

    • 方法调用(如 foo.bar() )

    • 列表索引查找(如 foo[2] )

    • 模板系统将使用第一个可用的类型,这是一种短路逻辑。点号查找可以嵌套多层。

    一般来说,如果变量不存在,模板系统在变量处插入引擎的 string_if_invalid 配置选项。这个选项的默认值为一个空字符串。

    模板语言

    标签(大约24个)

    1.if/else:{% if %} 支持使用 and 、 or 或 not 测试多个变量,或者取反指定的变量。

    • 如果需要通过括号指明优先级,应该使用嵌套的 if 标签。不支持使用括号控制操作的顺序。如果觉得有必要使用括号,可以考虑在模板外部执行逻辑,然后通过专用的模板变量传入结果。或者,直接使用嵌套的 {%if %} 标签。

    2.for:

    1.在标签中添加 reversed ,反向迭代列表。

    2.可以嵌套

    3.如果需要迭代由列表构成的列表,可以把每个子列表中的值拆包到独立的变量中。

    4.如果需要访问字典中的元素,也可以使用这个标签。

    5.在循环结束之前,无法“跳出”。如果需要这么做,修改要迭代的变量,只包含需要迭代的值。

    6.同样,也没有“continue”语句,不能立即返回到循环的开头。

    7.在 {% for %} 循环内部,可以访问一个名为 forloop 的模板变量。这个变量有几个属性,通过它们可以获知循环进程的一些信息:(待补充)

    3.ifequal/ifnotequal:

    用于比较两个值,在相等时显示一些内容。

    1.{% ifequal %} 标签比较两个值,如果相等,显示 {% ifequal %}{% endifequal %}之间的内容。

    2.参数可以是硬编码的字符串,使用单引号或双引号都行

    3.支持可选的 {% else %} 子句

    4.{% ifequal %} 的参数只能是模板变量、字符串、整数和小数

    5.其他变量类型,例如 Python 字典、列表或布尔值,不能在 {% ifequal %} 中硬编码。

    6.ifequal 标签可以替换成 if 标签和 == 运算符。

    7.{% ifnotequal %} 的作用与 ifequal 类似,不过它测试两个参数是否不相等。 ifnotequal 标签可以替换成 if标签和 != 运算符。

    4.include模板标签:{%include%}

    1.作用:引入另一个模板的内容。它的参数是要引入的模板的名称,可以是变量,也可以是硬编码的字符串(放在引号里,单双引号都行)。

    注释:

    1.使用{# #}不能分成多行

    2.使用{%comment%}编写多行标签,注释不能嵌套。

    过滤器:

    1.模板过滤器是在显示变量之前调整变量值的简单方式。

    2.有些过滤器可以接受参数。过滤器的参数放在冒号之后,始终放在双引号内。

    常见过滤器(大约60个)

    1.default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。

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

    3.filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB' , '4.1 MB' ,'102 bytes' , 等等)

    4.addslashes :在反斜线、单引号和双引号前面添加一个反斜线。可用于转义字符串。

    5.date :根据参数中的格式字符串格式化 date 或 datetime 对象。

    render函数:

    
    render(request, template_name, context=None, content_type=None, status=None, using=None)
    
    
    • render() 的第一个参数是请求对象,第二个参数是模板名称,第三个单数可选,是一个字段,用于创建传给模板的上下文。如果不指定第三个参数, render() 使用一个空字典。

    模板继承

    1.子模板可以覆盖块的内容、向块中添加内容,或者原封不动。

    2.{% block %} 它的作用很简单,告诉模板引擎,子模板可以覆盖这部分

    内容。

    3.{% extends "base.html" %}继承

    4.继承经常使用下述三层结构:

    1.创建 base.html 模板,定义网站的整体外观。这个模板的内容很少变化。

    2.为网站中的各个“区域”创建 base_SECTION.html 模板(如 base_photos.html 和 base_forum.html )。这

    些模板扩展 base.html ,包含各区域专属的样式和设计。

    3.为各种页面创建单独的模板,例如论坛页面或相册。这些模板扩展相应的区域模板。

    5.如果需要从父模板中的块里获取内容,使用 {{ block.super }} ,这是一个“魔法”变量,提供父模板中渲染后的文本。向块中添加内容,而不是完全覆盖时就可以这么做。

    高级模板技术

    RequestContext 和上下文处理器(待补充)

    跨站脚本攻击(Cross Site Scripting,XSS)

    • 为了避免这种漏洞,有两个选择:

    1.每个不信任的变量都传给 escape 过滤器,把有潜在危害的 HTML 字符转换成无危害的。Django 起初的几年默认采用这种方案,它的问题是把责任强加到开发者或模板编写者身上了,你要确保转义一切。但是,忘记转义数据是常事。

    2.利用 Django 的自动转义 HTML 特性。

    Django 默认转义模板中的每个变量标签。具体而言,转义的是下面五个字符:

    1. < 转换成 &lt;

    2. 转换成 &gt;

    3.(单引号)转换成 &#39;

    4." (双引号)转换成 &quot;

    5.& 转换成 &amp;

    这个行为默认已启用。如果使用 Django 的模板系统,就能受到这一措施的保护。

    禁用html转义

    1.在单个变量中禁用:safe过滤器

    2.在模板中的块里禁用:

    
    {% autoescape off %}
    
    Hello {{ name }}
    
    {% endautoescape %}
    
    
    • autoescape 标签的参数为on 或off。有时需要强制自动转义,有时则想禁用。

    • 如果使用模板的环境不确定是否启用了自动转义,应该添加 escape 过滤器,用于转义需要转义的变量。如果启用了自动转义, escape 过滤器会再次转义数据,但是这样做并无坏处,因为 escape 过滤器对自动转义过的

    变量没有影响。

    3.自动转义过滤器参数中的字符串字面量:

    • 字符串字面量插入模板时不会自动转义,就像是经过 safe 过滤器处理过了一样。

    • 从变量中得出的数据不是如此。变量的内容在需要时会自动转义,因为它们不在模板编写人的控制范围内

    模板加载内部机制

    秋来凉风起,无限思远人
  • 相关阅读:
    opencv 图片像素x,y 访问!!!
    python numpy 三维数组 排序问题
    python+opencv水表识别
    tesseractOCR安装
    cookie 的寻找和使用以及页面滚动(python+selenium)
    你还在用a标签吗?——用button替代a
    js正则高级函数(replace,matchAll用法),实现正则替换(实测很有效)
    腾讯云服务器centos7.2+nginx(开启gzip压缩)+uwsgi+Django+react
    轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器
    webstorm 添加css前缀(兼容)自动添加
  • 原文地址:https://www.cnblogs.com/lalavender/p/10744914.html
Copyright © 2011-2022 走看看