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模板相关内容

评论关闭