Django--模板语法(常用变量,过滤器,标签,自定义过滤器与标签,inclusion_tag的html代码片的应用,模板导入,模板继承,静态文件相关操作)
模版语法(常用变量与深度查询)
html文件
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>模板渲染</title> </head> <body>
# 模板语言变量
<p>{{ name }}</p> <p>{{ age }}</p> <p>{{ newage }}</p> <p>{{ lis }}</p> <p>{{ tup }}</p> <p>{{ dic }}</p> <p>{{ func1 }}</p> # 深度查询 <p>{{ obj }}</p> <p>{{ obj.name }}</p> <p>{{ obj.obj_func }}</p> <p>{{ obj.cla_func }}</p> <p>{{ obj.stati_test }}</p> <p>{{ obj_lis.0.name }}</p> </body> </html>
模版语法之过滤器
{#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#} length: 统计长度 name|length default: {#前面为空就显示后面的参数,前面为真就显示前面的#} <p>{{ lis1|default:'xx' }}</p> filesizeformat--1: <p>{{ 2013344444444444444444444445555444444444444444444444444444444444444444444444444444444444443|filesizeformat }}</p> 视图层:file_size = 103422 <p>{{ file_size|filesizeformat }}</p> date: 视图层: now_time = datetime.datetime.now() <p>{{ 'Y-m-d'|date:now_time }}</p> slice: <p>{{ lis|slice:'5:-1' }}</p> truncatechars: <p>{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:7 }}</p> dafd... 总共保留七位数,后面用三个小数点代替 truncatewords: <p>{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p> 我 dfaf ga dfgaas 你 ... safe: 模板层:h1 = '<h1>你好</h1>' <p>{{ h1 }}</p> 标签无法解析 <p>{{ h1|safe }}</p> 标签被解析 add: <p>{{ 1|add:2 }}</p> 正常加减乘除 <p>{{ 'asd'|add:'as'}}</p> 字符串拼接 <p>{{ 'asd'|add:23}}</p> 为空
模版语法之标签
for标签与for...empty标签
(1)for循环嵌套下一层的值存在上一层的forloop.parentloop的字典里 {% for foo in lis %} {{ forloop.counter }} {# 取出外层循环的值 #} {% for i in obj_lis %} {{ forloop.counter }} {# 取除本层循环的值 #} {{ forloop.parentloop.counter }} {# 取出外层循环的值 #} <p>{{ forloop }}</p> {% endfor %} }} {% endfor %} (2)循环为空走empty之路 {% for foo in lis %} <p>{{ forloop }}</p> {% empty %} <p>lxx</p> {% endfor %} (3)取出字典的key {% for foo in dic %} <p>{{ foo }}</p> {% endfor %} (4)取出字典的value {% for foo in dic.values %} <p>{{ foo }}</p> {% endfor %} (5)取出字典的 key,value {% for k,value in dic.items %} <p>{{ k }}-----{{ value }}</p> {% endfor %}
if……else标签
{% if user %} <a href="">退出</a> {% else %} <a href="">登陆</a> <a href="">注册</a> {% endif %}
自定义过滤器与标签
-1 先app是不是已经在setting中注册 -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块) -3 在模块下创建一个py文件,名字随意:mytag.py -4 # 第一步,导入template from django.template import Library # 第二步,定义一个叫register的变量=template.Library() register = Library() 过滤器:前面四步同上 -5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名) @register.filter(name='yyy') def str_add(str1, str2): # 业务逻辑很复杂 return str1 + str2 {% load mytag %} <p>{{ 1|yyy:2 }}</p> <p>{{ 'lqz'|yyy:'nb' }}</p> 标签:前面四步同上 -5 写一个函数,用@register.simple_tag()装饰 templatetags文件夹里 @register.simple_tag() def add_nb(value): return value+'nb' @register.simple_tag() def add_3(value,value2,value3): return value+value2+value3 模板层里: <p>{% add_nb 'lxx' %}</p> <p>{% add_3 'lxx' 'zxx' 'yxx' %}</p>
(4)inclusion_tag 模板语法[ 引用html片段 ] ( 联想自定义 过滤器/标签 )
-新建一个 templatetags 的文件夹 [ 名字不能变 ]
-在 templatetags 文件夹下创建 一个 xx.py
from django.template import Library
register = Library()
@register.inclusion_tag( html片段 )
def classify(username):
...
return {"category_num":category_num,... }
{% load xx %} 把 templatetags 文件夹下 xx load过来
{% 函数 参数 %}
模板导入
直接导入html文件的名字
template.html 文件不需要再写 html
在模板中: {% include '模板的名字'%} eg: {% include 'template.html'%}
<div> <div class="panel panel-info"> <div class="panel-heading">重金求子</div> <div class="panel-body"> 重金求子:18888888 </div> </div> <div class="panel panel-danger"> <div class="panel-heading"> <h3 class="panel-title">老男孩教育</h3> </div> <div class="panel-body"> 老男孩教育 </div> </div> </div>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <style type="text/css"> .head { background-color: #00AA88; height: 100px; } </style> </head> <body> <div class="head"></div> <div class="container-fluid content"> <div class="row"> <div class="col-md-3"> {% include 'left.html' %} </div> <div class="col-md-9"> </div> </div> </div> </body> </html>
母板继承
(1) extends : {% extends 母版名字 %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <style type="text/css"> .head { background-color: #00AA88; height: 100px; } </style> </head> <body> <div class="head"></div> <div class="container-fluid content"> <div class="row"> <div class="col-md-3"> <div> <div class="panel panel-info"> <div class="panel-heading">重金求子</div> <div class="panel-body"> 重金求子:18888888 </div> </div> <div class="panel panel-danger"> <div class="panel-heading"> <h3 class="panel-title">老男孩教育</h3> </div> <div class="panel-body"> 老男孩教育 </div> </div> </div> </div> <div class="col-md-9"> {% block content %} <p>我是母板的内容</p> {% endblock %} </div> </div> </div> </body> </html>
{% extends 'template.html' %} 继承母版全部
(2)block : {% block 名字 %}
(1)模板中相当于定义了一个盒子
<div class="col-md-9">
{% block content %}
{% endblock content%}
</div>
(2)子版看起来是这样的
{% extends 'template.html' %} 先继承母版
{% block content %}
<p>我是母板的内容</p> 在子板中往盒子里填充内容
{{ block.super }} 继承母版内容
{% endblock content %}
继承重点提示!!!
1.{% extends %}
标签,它必须是模版中的第一个标签
2.不能在一个模版中定义多个相同名字的 block
标签。
静态文件相关操作
方法(1):写死 <link rel="stylesheet" href="/static/css/mycss.css"> 方法(2): {% load static %} <link rel="stylesheet" href={% static 'css/mycss.css' %}>
{% load static %} 起别名
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img> 引用名字
方法(3): {% load static %} <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">
作业:
1 模板语法:上课讲的,回去敲一遍(整理到博客上)
2 常用的过滤器,自己敲一遍
3 自定义一个过滤器:length,add(支持数字,字符串,数字字符串),
-拓展:safe
templatetags文件夹下的 mytag.py from django.template import Library register = Library() @register.filter(name='length') def str_add(str1, str2): try: return str1 + str2 except: return str(str1) + str(str2) templates文件夹下: <p>{{ 1|length:2 }}</p> <p>{{ 'lqz'|length:1.5}}</p>
自定义过滤器语法 {{ 参数1|过滤器名字:参数2 }}
4 自定义标签:详见下午