Django—模板层

本文详细介绍了Django模板的常用语法,包括变量、注释、过滤器和标签的使用。探讨了Django过滤器,特别是safe过滤器的使用,以及if判断和for循环等标签的语法。还讲解了如何自定义过滤器和标签,以及模板的导入和继承机制,以实现代码复用和高效开发。
摘要由CSDN通过智能技术生成

目录

        常用语法

变量

模板语法之注释

模板语法之过滤器

常见的django过滤器

模板语法之标签

自定义过滤器,标签和inclusion_tag

 自定义过滤器

模板的继承


常用语法

{{}}             变量相关

{%  %}       逻辑相关 

模板语法传值支持python的所有基本数据类型

def index(request):
#模板语法可以传递的后端数据类型
1=123
f=12.3
S='哈哈哈哈哈
b True
1=[111,222,333,444]
t=(1,2,3,4)
d={'name':'jason','age':15,'info':有点意思'}
se={'丽丽''haha''hehe'}
return render(request.'index.html'locals())
123
12.3
哈哈哈哈哈
True
[111,222,333,444]
(1,2,3,4)
'name':'jason','age':15,"info':'有点意思}
{'丽丽','hehe,'haha'} 

内部能够自动判断当前的变量名是否可以 加括号调用,如果可以就会自动执行,针对函数名和类名

123
12.3
哈哈哈哈哈
True
[111,222,333,444]
(1,2,3,4)
'name':'jason','age':15,"info':'有点意思}
{'丽丽','hehe,'haha'} 
我是返回值
#自动加括号调用,不支持传参
<app01.views.index.<locals>.MyClass object at 0x00000248E04EB4E0>
<app01.views.index.<locals>.MyClass object at 0x00000248E04D34A8>

变量

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

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

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

字典查询(Dictionary lookup)
属性或方法查询(Attribute or method lookup)
数字索引查询(Numeric index lookup)

注意事项:

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

模板语法之注释

{# 注释内容 #}

模板语法之过滤器

过滤器类似于内置函数,但是这种内置函数最多只能额外传输一个参数。

语法结构:{{ 数据对象|过滤器名称:参数 }}

常见的django过滤器

#1、default
#作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
{{ value|default:"nothing" }}

#2、length
#作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4
{{ value|length }}

#3、filesizeformat
#作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB
{{ value|filesizeformat }}

#4、date
#作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02
{{ value|date:"Y-m-d" }}  

#5、slice
#作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg"
{{ value|slice:"0:2" }} 

#6、truncatechars
#作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点
{{ value|truncatechars:8 }}

#7、truncatewords
#作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..."
{{ value|truncatewords:2 }}

#8、safe
#作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成&lt;script&gt;alert(123)&lt;/script&gt;
交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,
但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe,比如value='<a href="https://www.baidu.com">点我啊</a>',
在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘
{{ value|safe }}

针对safe过滤器,我们也可以在后端实现:使用mark_safe方法后将结果传给页面,页面就能识别标签语法了。

from django.utils.safestring import mark_safe
tag = '<h1">内容</h1>'
res = mark_safe(ttt)

模板语法之标签

语法结构:

{{ 标签名称… }}
内容
{{ end标签名称 }}

if判断

{% if 条件1 %}
内容
{% elif 条件2 %}
内容
{% else %}
内容
{% endif %}

for循环

{% for 变量 in 容器类型 %}
内容
{% empty %} # 可不写
for循环对象为空时执行
{% endfor %}

自定义过滤器,标签和inclusion_tag

 自定义过滤器

当内置的过滤器或标签无法满足我们需求时,我们可以自定义,具体操作步骤如下

1.  在settings中的INSTALLED_APPS添加当前app的名字,不然django无法找到自定义的过滤器或标签

2. 在文件夹app01中创建子文件夹templatetags(文件夹名只能是templatetags)

3. 在templatetags新建任意.py文件,

4. 新建的py文件内需要先提前编写两行固定的代码

from django import template
register = template.Library()

5. 使用时需要先使用模板语法导入py文件名

{% load py文件名 %}

6. 自定义过滤器或标签必须重新启动django方可生效

自定义的过滤器只能定义最多两个参数

#1、自定义过滤器

@register.filter
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
    return  v1 * v2

使用:必须先加载存有自定义过滤器和标签的文件

#  
{% load my_tags %}

{{ salary|my_multi_filter:12 }}

自定义的标签可以定义多个参数

#2、自定义标签
@register.simple_tag
def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
    return v1 * v2

 使用:

{% my_multi_tag 1 2 %}

inclusion_tag
inclusion_tag可以把写好的一些标签放入到网页中。

该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置。

@register.inclusion_tag('content.html')
def func(n):
    l1 = [i for i in range(n)]
    return l1

content.html

<ul>
    {% for i in l %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

页面调用:

{% func 10 %}

模板的导入


在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签
比如我想要让home.html与index.html一样,那么我只需要将index.html导入到home.html中即可。

home.html

{% include ‘index.html’ %}

模板的继承

类似于面向对象中的继承:继承了某个页面就可以使用该页面上所有的资源
有很多差不多的页面 知识局部发生了变化 模板的继承可以很好的实现该需求
1.先在模板中通过block划定将来可以被修改的区域

{% block content %}
<h1></h1>
<p></p>
{% endblock %}

2. 子模板继承模板

{% entends ‘index.html’ %}

3.修改划定的区域

{% block centent %}
<h1></h1>
<p></p>
{%endblock%}

4.子页面还可以重复使用父页面的内容

{{block.super}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值