Django之模板
Posted mjc69213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之模板相关的知识,希望对你有一定的参考价值。
Django模板中只需要记两种特殊符号:
{{ }}和 {% %}
{{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。
一、变量
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
view中代码:
def template_test(request): l = [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", {"l": l, "d": d, "person_list": person_list})
模板中支持的写法:
{# 取l中的第一个参数 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取对象的name属性 #} {{ person_list.0.name }} {# .操作只能调用不带参数的方法 #} {{ person_list.0.dream }}
注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:
- 在字典中查询
- 属性或者方法
- 数字索引
二、Filters 过滤器
翻译为过滤器,用来修改变量的显示结果。
(一)语法
语法: {{ value|filter_name:参数 }}
‘|‘左右没有空格没有空格没有空格
(二)内置的过滤器
add:参数 加 数字相加 字符串拼接 列表拼接 default:参数 变量不存在或者为空 显示默认值 filesizeformat 人性化显示文件大小 kb PB upper 大写 lower 小写 title 首字母大写 ljust:20 左对齐 rjust:20 右对齐 center:20 居中 length 长度 slice:‘::‘ 切片 join:‘_‘ 拼接列表 first 取第一个元素 last 取最后一个元素 safe 取消对HTML代码的转义 date:‘Y-m-d H:i:s‘ 日期的格式化 truncatechars:18 文本上的时候进行截断 按18截断
(三)自定义过滤器
自定义过滤器只是带有一个或两个参数的Python函数:
- 变量(输入)的值 - -不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”。
1. 在app下创建一个名叫templatetags的python包 templatetags不能错
2. 在templatetags里建一个py文件 myfilters
app01/ __init__.py models.py templatetags/ # 在app01下面新建一个package package __init__.py myfilters.py # 建一个存放自定义filter的py文件 views.py
3、编写自定义filter
from django import template register = template.Library() # register名字不能错 @register.filter # @register.filter(name=‘dsb‘) 这个dsb相当于给自定义的filter取了个别名,在使用自定义filter的时候不再使用函数名而是使用这个别名 def rep(value, bar): 这个value是调用自定义filter的时候,传过来的值,arg是filter的参数,如果没加别名,那么调用的时候,过滤器的名子就是函数的名子 print(value, bar) # 前面部分 后面部分 return str(value)+str(bar)
views.py
def index(request): return render(request, ‘index.html‘, {‘date‘:‘前面部分‘})
4、重启
5、使用filter
{% load myfilters %} 使用函数名 {{ value |dsb:‘arg‘ }} 使用别名
三、tags
1、for循环
系统不支持中断循环,系统也不支持continue语句
<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 本层循环的外层循环
# 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了 # 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它 # Django会在for标签的块中覆盖你定义的forloop变量的值 # 在其他非循环的地方,你的forloop变量仍然可用
for ... empty
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
2、if判断
{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容
{% if num >= 100 and 8 %} {% if num > 200 %} <p>num大于200</p> {% else %} <p>num大于100小于200</p> {% endif %} {% elif num < 100%} <p>num小于100</p> {% else %} <p>num等于100</p> {% endif %} {% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量 {% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的: {% if obj1 and obj2 or obj3 %}
3、with
用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
4、{% url %}
引用路由配置的地址
<form action="{% url "bieming"%}" > <input type="text"> <input type="submit"value="提交"> {%csrf_token%} </form>
5、{% verbatim %}
禁止render
{% verbatim %}
{{ hello }}
{% endverbatim %}
6、csrf_token
用于生成csrf_token的标签,用于防治跨站攻击验证。 其实,这里是会生成一个input标签,name=csrfmiddlewaretoken value= 随机字符串,可以提交post请求。
7、注意事项
1)Django的模板语言不支持连续判断,即不支持以下写法:
{% if a > b > c %} ... {% endif %}
2)Django的模板语言中属性的优先级大于方法
def xx(request): d = {"a": 1, "b": 2, "c": 3, "items": "100"} return render(request, "xx.html", {"data": d})
如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中:
{{ data.items }}
默认会取d的items key的值。
四、extend模板继承
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载,多个页面有很多相同或者相似的内容,为了减少代码的重复和修改方便。
1. 写母版 ——》 写一个普通模板(HTML文件) 把多个页面有相同或者相似的内容提取出来,把不同的地方或者需要变动的地方,在母版中用block块定义,子模板需要覆盖的地方。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html>
2、写子页面,继承母版 {% extends ‘base.html‘ %},重新写block块中的内容
{% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}
3、注意事项:
- 1. {% extends ‘base.html‘ %}写在第一行
- 2. 修改的内容写在block中
- 3. {% extends ‘base.html‘ %} ‘base.html‘ 不加‘‘当成变量
五、组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。就是一小段HTML代码 ,那需要用,就导入到那
{% include ‘navbar.html‘ %}
六、静态文件相关
1、{% static ‘xxx’ %} 去settings拿STATIC_URL,和xxx拼接
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
{% load static %} <script src="{% static "mytest.js" %}"></script>
某个文件多处被用到可以存为一个变量
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>
2、{% get_static_prefix %} xxx 去settings拿STATIC_URL,和xxx拼接
{% get_static_prefix %} —— 》 去settings拿STATIC_URL
{% get_static_prefix %}css/pub.css
或者
{% 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!" />
七、自定义simple_tag和inclusion_tag
(一)simple_tag
和自定义filter类似,只不过接收更灵活的参数。
1. 在app下创建一个名叫templatetags的python包
2. 在templatetags里建一个py文件
3. 在py文件中编辑:
from django import template register = template.Library()
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
4、使用自定义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‘) # 把result.htm 代码片段传给要用的地方
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 %} // 10是传给show_results 的参数
</body> </html>
结果:
以上是关于Django之模板的主要内容,如果未能解决你的问题,请参考以下文章