Django模板相关内容,相关内容,常用语法{{ }}
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 templateregister = template.Library()@register.filterdef 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 templateregister = 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模板相关内容
评论关闭