django-模板语法
一、模板语法之变量 : {{ value }}
在后台,在渲染HTML页面时,以字典的形式把变量传给前端
在前端,模板变量({{ }})内写python代码,相应的数据会展示在HTML之上
# urls path('template/', views.template), # views def template(request): import datetime date = datetime.datetime.now() return render(request, 'test/template.html', {'date': date}) # html <input type="text" placeholder="{{ date }}"> <div>时间:{{ date }}</div>
二、模板语法之过滤器 : {{ value|filter_name: param }}
default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing" }}
length:返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }}
date:对datetime类型的时间进行格式化,如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }} <!--2018-03-12-->
slice:切片,索引a到索引b,如果 value="hello world"
{{ value|slice:"2:-1" }}
truncatechars:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。参数:要截断的字符数
{{ value|truncatechars:9 }}
safe:把后台传的字符串按照HTML标签的规则解析
value="<a href="">点击</a>" {{ value|safe}} <!--得到一个a标签-->
三、模板语法之标签 : {{ value|filter_name: param }}
for 标签:循环
其中empty为可选项,for循环也可与{{ forloop }}配合使用
{% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}
forloop.counter The current iteration of the loop (1-indexed) forloop.counter0 The current iteration of the loop (0-indexed) forloop.revcounter The number of iterations from the end of the loop (1-indexed) forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) forloop.first True if this is the first time through the loop forloop.last True if this is the last time through the loop
if 标签
{% if num > 100 or num < 0 %} <p>无效</p> {% elif num > 80 and num < 100 %} <p>优秀</p> {% else %} <p>凑活吧</p> {% endif %}
with 标签:给一个变量起别名
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
四、自定义标签和过滤器
1、在app中创建templatetags目录(目录名只能是templatetags)
2、目录下创建任意py文件(如my_tags.py)
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.filter def filter_multi(v1,v2): return v1 * v2 <br> @register.simple_tag def simple_tag_multi(v1,v2): return v1 * v2 <br> @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
3、在html文件中使用自定义标签和过滤器是,需导入它们所在的py文件,方法
{% load my_tags %}
4、使用
-------------------------------.html {% load xxx %} # num=12 {{ num|filter_multi:2 }} #24 {{ num|filter_multi:"[22,333,4444]" }} {% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %}
注意:filter可以用在if等语句后,simple_tag不可以。filter最多可接收两个参数
{% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}
四、HTML的模板继承
父模板:一个完整的HTML文件,其中可以创建若干{% block block_name %} {% endblock %}标签
子文件:清空HTML标签,在首行使用 {% extends '父模板' %} ,来继承父模板的所有HTML代码,它告诉模版引擎,这个模版“继承”了另一个模版,子文件在block标签中写自己的HTML{% block block_name %} <div><\div> <p></p> <input /> {% endblock %}
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{%/span> endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}