加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

【Django】模板系统 -- 2019-08-17 06:26:24

发布时间:2020-12-20 10:58:16 所属栏目:Python 来源:网络整理
导读:目录 一、变量 二、过滤器 Filters 2. length 3. filesizeformat 4. slice 5. add 6. first、last 7. join 8. truncatechars 9. truncatewords 10. date 11. safe 12. cut 13. lower、upper、title、ljust、rjust、center 14. 自定义filter 15. Tags 16. csr

目录

  • 一、变量
  • 二、过滤器 Filters
    • 2. length
    • 3. filesizeformat
    • 4. slice
    • 5. add
    • 6. first、last
    • 7. join
    • 8. truncatechars
    • 9. truncatewords
    • 10. date
    • 11. safe
    • 12. cut
    • 13. lower、upper、title、ljust、rjust、center
    • 14. 自定义filter
    • 15. Tags
    • 16. csrf_token
  • 三、母板
    • 模版继承
    • 块(block)
  • 四、组件
  • 五、静态文件相关
    • 使用get_static_prefix
    • 自定义simpletag_tag
    • 自定义inclusion_tag

原文: http://blog.gqylpy.com/gqy/261

"@
官方文档


两种特殊符号:=={{ }}== 与 =={% %}==
变量相关使用{{ }},逻辑相关使用{% %}.

一、变量

在Django模版语言中按此语法使用:{{ 变量名 }}

**当模版引擎遇到一个变量时,它将计算这个变量,然后用结果替换它本身.
变量的命名包括任何字母数字以及下划线(_)的组合.
变量名称中不能有空格或标点符号.**

点(.) 在模版语言中有特殊的含义,当模版系统遇到点时,它将以以下顺序查询:

  1. 字段查询(Dictionary lookup)
  2. 属性或方法查询(Attribute or method lookup)
  3. 数字索引查询(Numeric index lookup)

注意事项:

  1. ==如果计算结果的值是可调用的,它将被无参数调用,调用的结果将成为模版的值.==
  2. ==如果使用的变量不存在,模版系统将插入 string_if_invalid 选项的值,此选项的值默认为空字符串.==

简单示例:

from django.shortcuts import HttpResponse,render,redirect


def template_test(request):
    lst = ['a','b','c','d']

    dct = {
        'name': 'zyk','sex': 'boy','hobby': ['Python','Django','MySQL']
    }

    class Person(object):
        def __init__(self,name,sex):
            self.name = name
            self.sex = sex

        def blogging(self):
            return '%s is blogging.' % self.name

    zyk = Person('zyk','boy')
    xhh = Person('xhh','girl')
    xmm = Person('xmm','girl')
    person_list = [zyk,xhh,xmm]

    return render(
        request,'template_test.html',{
            'lst': lst,'dct': dct,'person_list': person_list
        }
    )

模版中可以这样写:

取lst中索引为0的值:
=={{ lst.0 }}== # a
取dct中name的值:
=={{ dct.name }}== # zyk
取dct中的hobby列表中的索引为1的值:
=={{ dct.hobby.1 }}== # Django
取person_list中索引为2的对象的name:
=={{ person_list.2.name }}== # xmm
调用person_list中索引为0的对象的blogging方法:
=={{ person_list.0.blogging }}== # zyk is blogging.

二、过滤器 Filters

在Django模版语言中,通过使用 过滤器 来改变变量的显示.

语法:=={{ 变量|过滤方法:参数 }}==
其中:管道符(|)用来应用过滤器,冒号(:)用来指定过滤器的参数.

注意事项:

  1. 过滤器支持"链式"操作,即一个过滤器的输出可以作为另一个过滤器的输入.
  2. 过滤器可以接受参数,例如:{{ value|truncatewords:30 }},表示显示values的前30个词.
  3. 过滤器参数包含空格的话,必须用引号包裹起来,比如使用逗号和空格拼接列表中的元素:{{ list|join:‘,‘ }}.
  4. ==管道符(|)两边没有空格.==
    ***

    1. default

    指定变量的默认值.
    语法:==value|default:"默认值"==

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

注:
在settings.py文件内的TEMPLATES内的OPTIONS内可以增加一个选项来指定默认值(优先级大于default):
‘string_if_invalid‘: "默认值",
***

2. length

返回值的长度,作用于字符串和列表.
语法:==value|length==
***

3. filesizeformat

将值格式化为一个"人类可读的"文件尺寸.
语法:==value|filesizeformat==
***

4. slice

切片
语法==value|slice:"2:-1"==
***

5. add

在值的末尾添加指定值,如果全部为数字,则相加.
语法:==value|add:"添加的值"==
***

6. first、last

取第一个元素、取最后一个元素.
可用于循环的时候判断是否为第一个或最后一个值.
***

7. join

使用字符串拼接列表.
语法:==value|join:"字符串"==
***

8. truncatechars

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾(注意:"..."占3个字符).
语法:==value|truncatechars:9==
***

9. truncatewords

在一定数量的字后截断字符串.
语法:==value|truncatewords==

10. date

日期格式化
语法:==value|date:‘Y-m-d H:i:s‘==

可格式化输出的字符
***

11. safe

Django的模版中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,是为了安全。

但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。

为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器(value|safe)的方式告诉Django这段代码是安全的不必转义。

例如:value = "<a href=‘#‘></a>"
***

12. cut

移除所有与指定字符相同的字符串.
语法:==value|cut:‘空格‘==
***

13. lower、upper、title、ljust、rjust、center

依次为:全部小写、全部大写、标题化、左对齐、右对齐、居中.
***

14. 自定义filter

自定义过滤器只是带有一个或两个参数的Python函数:

  • 变量(输入)的值:不一定是一个字符串
  • 参数的值: 可以有一个默认值,或完全省略

例如,在过滤器 {{ var|func:‘var‘ }} 中,过滤器func将传递变量var和参数‘bar‘.

自定义filter代码文件存放位置:
==在app下新建一个名为templatetags的package,再在package下面创建自定义filter的文件.==

自定义filter文件写法如下:

from django import template
register = template.Library()

@register.filter(name='addSB')
def add_sb(value):
    return '%s is SB' % value

调用自定义filter:

{# 先导入自定义的filter文件 #}
{% load 文件名 %}

{# 使用自定义的filter #}
{{value|addSB }}

15. Tags

for
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:
|Variable| Description |
|--|--|
|forloop.cunter|当前循环的索引值(从1开始)|
|forloop.cunter0|当前循环的索引值(从0开始)|
|forloop.revcounter|当前循环的倒序索引值(从1开始)|
|forloop.revcounter0|当前循环的倒序索引值(从0开始)|
|forloop.first|当前循环是不是第一次循环(布尔值)|
|forloop.last|当前循环是不是最后一次循环(布尔值)|
|forloop.parentloop|本层循环的外层循环|

for ... empty
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
if ... else
{% if user_list|length > 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}
if ... elif ... else
{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

==if语句支持:and、or、==、>、<、!=、<=、>=、in、not in、is、is not判断.==
==但是!Django模版语言不支持连续判断,即不支持以下写法:==

{% if a > b > c %}
...
{% endif %}
with

定义一个中间变量

{% with value as v %}
    {{ v }}
{% endwith %}

16. csrf_token

用于跨站点请求伪造保护.
如果是提交form表单,则必须写在form标签内部:
=={% csrf_token %}==

三、母板

示例(母板文件为:base.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>Title</title>
  {% block page-css %}
  {% endblock %}
</head>
<body>

<h1>这是母板的标题</h1>
{% block page-main %}
{% endblock %}

<h1>母板底部内容</h1>
{% block page-js %}
{% endblock %}
</body>
</html>

注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
***

模版继承

示例(继承上例的母版):

{% extends 'base.html' %}

块(block)

通过在母版中使用 =={% block xxx %}== 来定义"块".
在子页面中通过定义母板中的block名来对应替换母版中相应的内容.

例如:

{% block page-css %}
...
{% endblock %}

{# 这是母板的标题 #}
{% block page-main %}
...
{% endblock %}

{# 母板底部内容 #}
{% block page-js %}
...
{% endblock %}


四、组件

可以将常用的页面内容,如导航条、页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

{% include "文件全名" %}

示例(在base.html文件中导入nav.html文件内的代码):



五、静态文件相关

==从settings文件内获取 STATIC_URL=‘/static/‘ 和相对路径进行拼接.==

{% load static %}
<img src="{% static 'images/hi.jpg' %}" alt="Hi!"/>

引用JS文件时使用:

{% <script src="{% static 'mytest.js' %}"></script> %}

如果某个文件多处被同时用到,可以存为一个变量:

{% load static %}
{% static 'images/hi.jpg' as myphoto %}
<img src="{{ myphoto }}"><img>

示例(导入bootstrap文件):


***

使用get_static_prefix

==从settings文件内获取 STATIC_URL=‘/static/‘ 和相对路径进行拼接.==

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

# 或者

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

示例(导入bootstrap文件):


自定义simpletag_tag


***

自定义inclusion_tag

1.在app下创建一个名为 ==tmplatetags== 的python package包.
2.在包下新建py文件(如:mytags.py)
3.编辑文件,具体步骤如下:



"

原文: http://blog.gqylpy.com/gqy/261

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读