Django模板层
模板层语法(两类)
变量相关:{{ }}
逻辑相关:{% %}
给模板传值的方法
#方法1 #通过字典传值,指名道姓,例如下 return render(request,'reg.html',{'n':n,'f':f}) #方法2 return render(request,'reg.html',locals()) #locals()会将它所在名称空间中的所有名字全部传给前端 #缺点是如果你的前端并不需要那么多数据就会造成资源的浪费
变量相关
经过测试,python中的整型,浮点型,字符串,列表,字典,元组以及集合都可以传给前端
#模板中支持的写法 {# 取l中的第一个参数 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取对象的name属性 #} {{ person_list.0.name }} {# .操作只能调用不带参数的方法 #} {{ person_list.0.dream }}
补充:也可以传函数名,会自动加括号调用改函数,前端会展示函数调用之后的返回值,如果函数需要传参的话,那么不可以,因为模板语法还不支持。
模板语法之过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
#length {#<p>{{ l|length }}返回值的长度</p>#} #default {#<p>{{ ss|default:'当|左边的变量为空就会返回|右边的值' }}default跟你后端get方法很像</p>#} {#<p>{{ ss|default:'' }} default必须要有两个参数</p>#} #filesizeformat {#<p>{{ file_size|filesizeformat }}将值转化成一个文件大小</p>#} #trunchatewords {#<p>{{ info|truncatewords:3 }} 就是按空格截取 三个点不算</p>#} #truncatechars {#<p>{{ info|truncatechars:6 }}按字符截取内容 三个点也算</p>#} #dare {#<p>{{ ctime|date:'Y-m-d' }} 只需要掌握年月日就可以了</p>#} #add {#<p>{{ n|add:100 }}</p>#} {#<p>{{ s|add:'hahah 翻车啦' }}加</p>#} #slice {#<p>{{value|slice:"2:1"}}切片,顾头不顾尾,可以规定步长</p>#}
#safe {#<p>{{ xxx|safe }}</p>#} {#<p>{{ yyy|safe }}</p>#} """ Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义,我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。 """
自定义过滤器
自定义过滤器只是带有一个或两个参数的Python函数:
- 变量(输入)的值 - -不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar”。
#自定义顾虑器的存放位置 app01/ __init__.py models.py templatetags/ # 在app01下面新建一个package package __init__.py app01_filters.py # 建一个存放自定义filter的文件 views.py
#编写自定义过滤器 from django import template register = template.Library() @register.filter(name="cut") def cut(value, arg): return value.replace(arg, "") @register.filter(name="addSB") def add_sb(value): return "{} SB".format(value)
#在前端使用自定义过滤器 {# 先导入我们自定义filter那个文件 #} {% load app01_filters %} {# 使用我们自定义的filter #} {{ somevariable|cut:"0" }} {{ d.name|addSB }}
模板语法之标签
for循环
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
关于forloop
if判断
{% for foo in '' %} {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last %} <p>这是最后一次了啊</p> {% else %} <p>来啊来啊!!!</p> {% endif %} {% empty %} <p>当for循环的对象为空的时候 会走empty</p> {% endfor %}
with
定义一个中间变量,多用于给一个复杂的变量起别名。
注意等号左右不要加空格。
{% with business.employees.count as total %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
自定义标签
# 自定义标签 # 支持传多个值 @register.simple_tag(name='jason') def xxx(a,b,c,year): return '%s?%s|%s{%s'%(a,b,c,year) # 自定义inclusion_tag """ 接收用户传入的参数 然后作用于一个html页面 在该页面上渲染数据 之后将渲染好的页面 放到用户调用inclusion_tag的地方 """ # 自定义inclusion_tag @register.inclusion_tag('bigplus.html') def bigplus(n): l = [] for i in range(n): l.append('第%s项'%i) return {'l':l}
#前端 <ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %} </ul>
模板的继承与导入
#首先需要再被继承的模块中划分多个区域 {% block 给区域起的名字 %} {% endblock %} #通常情况下一个模板中应该至少有三块 {% block css %} 页面css代码块 {% endblock %} {% block js %} 页面js代码块 {% endblock %} {% block contet %} #注意起的名字不加引号 页面主题内容 {% endblock %}
子板继承模板
#先继承模板所有的内容 {% extends 'home.html' %} #然后根据block块的名字修改指定区域的内容 {% block content %} <form action=""> <p>username:<input type="text" class="form-control"></p> <p>password:<input type="text" class="form-control"></p> </form> {% endblock %}
模板的导入:将一段html当做模块的方式导入另一个html展示
{% include '想导入的html文件名' %}