Django模板相关内容
Posted kindvampire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板相关内容相关的知识,希望对你有一定的参考价值。
常用语法
{{ }} :填充变量
{% %}:模板中逻辑相关的操作。
变量
模板中的“.”有特殊用法
例句:
def template_test(request): lst = [11, 22, 33] d = {"name": "alex"} class Person(object): def __init__(self, name, age): self.name = name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) Egon = Person(name="Egon", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, Egon, Eva_J] return render(request, "template_test.html", {"lst": lst, "d": d, "person_list": person_list})
模板中支持的写法:
{# 取列表中的第一个参数 #} {{ lst.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取对象的name属性 #} {{ person_list.0.name }} {# .操作只能调用不带参数的方法 #} {{ person_list.0.dream }}
注:当模板系统遇到一个"."时,会按照如下的顺序去查询:
- 在字典中查询
- 属性或者方法
- 数字索引
过滤器
内置过滤器
语法:{{ value|filter_name:参数 }}
过滤器 | 用法 | 备注 |
default |
{{ value|default:"nothing"}} |
设置默认值,如果值为空,显示默认值 |
filesizefomat |
{{ value|filesizeformat }} |
将值格式化为一个 “人类可读的” 文件尺寸,如:13kB、1MB等 |
add |
{{ value|add:"2" }} |
给变量加参数;另:{{ first|add:second }},如果first是[1,2,3].second是[4,5,6],则输出结果为:[1,2,3,4,5,6] |
lower |
{{ value|lower }} |
全小写 |
upper |
{{ value|upper}} |
全大写 |
title |
{{ value|title }} |
标题 |
ljust |
{{ value|ljust:"10" }} |
左对齐 |
rjust |
{{ value|rjust:"10" }} |
右对齐 |
center |
{{ value|center:"15" }} |
居中 |
length |
{{ value|length }} |
返回value的长度,如 value=[‘a‘, ‘b‘, ‘c‘, ‘d‘]的话,就显示4. |
slice |
{{value|slice:"2:-1"}} |
切片 |
first |
{{ value|first }} |
取第一个元素 |
last |
{{ value|last }} |
取最后一个元素 |
join |
{{ value|join:" // " }} |
使用字符串拼接列表。同python的str.join(list)。 |
truncatechars |
{{ value|truncatechars:9}} |
截断9个字符,不显示的内容用"..."表示 |
date |
{{ value|date:"Y-m-d H:i:s"}} |
日期格式化 |
safe |
{{ value|safe}} |
这里的vlaue表示一个自定义的html标签,为了取消模板系统的转义(阻止系统将其原样输出)加safe |
自定义过滤器
1、自定义过滤器文件存放的位置
app01/ __init__.py models.py templatetags/ # 在app01下面新建一个package package __init__.py app01_filters.py # 建一个存放自定义filter的py文件 views.py
2、编写自定义过滤器
from django import template register = template.Library() @register.filter def fill(value, arg): # 将空格替换为自定义的符号,使用该过滤器的人自己设定,等同于字符串操作方法replace() return value.replace(" ", arg) @register.filter(name="addSB") def add_sb(value): # 在每个值的后面添加"SB" return "{} SB".format(value)
3、模板中使用
{# 先导入我们自定义filter那个文件 #} {% load app01_filters %} {# 使用我们自定义的filter #} {{ somevariable|fill:"__" }} {{ d.name|addSB }}
模板中的逻辑操作
for
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
for循环可用的一些参数:
用法 | 描述 |
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(到1结束) |
forloop.revcounter0 | 当前循环的倒序索引值(到0结束) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
for ... empty
# for循环正常,用for循环的值,循环不出来用empty下的值 <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
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判断。
母版的继承
在子页面中在页面最上方使用下面的语法来继承母板。
{% extends ‘layouts.html‘ %}
块
通过在母板中使用{% block xxx %}
来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
如:
母版:
{% block muban %}
......
{% endblock %}
子页面:
{%extend muban.html%}
...
{% block muban %} <p>人比黄花瘦</p> {% endblock %}
....
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
{% include ‘navbar.html‘ %}
静态文件相关
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
引用JS文件时使用:
{% load static %} <script src="{% static "mytest.js" %}"></script>
某个文件多处被用到可以存为一个变量
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>
自定义simple_tag
和自定义filter类似,只不过接收更灵活的参数。
1、定义注册simple tag
@register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c)
2、使用simple tag
{% load app01_demo %} {# simple tag #} {% plus "1" "2" "abc" %}
自定义 inclusion_tag
多用于返回html代码片段
示例:
templatetags/my_inclusion.py
from django import template register = template.Library() @register.inclusion_tag(‘result.html‘) def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data}
templates/result.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
templates/index.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>inclusion_tag test</title> </head> <body> {% load my_inclusion %} {% show_results 10 %} </body> </html>
总结:templates目录下的三种自定义标签:
1、自定义filter
2、自定义sample_tag
3、自定义includsion_tag
以上是关于Django模板相关内容的主要内容,如果未能解决你的问题,请参考以下文章