模板语法之过滤器
1、default:
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器:{{ li|default:"如果显示为空,设置的解释性的内容" }}</p>
2、length:返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }} //如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。
3、filesizeformat:
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
{{ value|filesizeformat }} //如果value
是 123456789,输出将会是117.7 MB
。
4、date:如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}
5、slice :切片
{{ value|slice:"2:-1" }} //value="hello world"
6、truncatechars 截断
<p>截断字符:{{ content|truncatechars:20 }}</p> <p>截断单词:{{ content|truncatewords:4 }}</p>
如果content是“I am is haiyan,how are you asd df dfgfdgdg?
输出结果: 截断字符:I am is haiyan,ho...
输出结果 :截断单词:I am is haiyan,how ...
7、safe
value="<a href="">点击</a>" {{ value|safe}}
自定义标签和过滤器
1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
2、在app中创建templatetags模块(模块名只能是templatetags)
3、在templatetags里面创建任意 .py 文件
如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.filter 过滤器 def multi(x,y): return x*y @register.simple_tag 标签 def multitag(x,y,z): return x*y*z @register.simple_tag 标签 def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
#自定义过滤器函数的参数只能两个,可以进行逻辑判断 #自定义标签无参数限制,不能进行逻辑判断
4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
{% load my_tags %}
5、使用
对于自定义过滤器:
@register.filter
def filter_mult(x,y):
return x+y
{{ 20|filter_mult:3}} 不可以传多个参数,可以用于if 语句中
=============================================
对于自定义标签:
@register.simple.tag
def render_app_name(class):
return class.name
{% render_app_name class %} 可以传多个参数,不可以用于if语句中
扩展:
{% render_app_name class as app_name %} //可以用来循环处理这个返回这
{% for name in apo_name%}
pass
{% endfor %}
补充:inclusion_tag的使用
#!usr/bin/env python # -*- coding:utf-8 -*- from django.template import Library from django.urls import reverse from stark.service.v1 import site register = Library() @register.inclusion_tag("stark/form.html") def form(model_form_obj): from django.forms import ModelChoiceField from django.forms.boundfield import BoundField # 数据都封装在这个类了 new_form = [] for bfield in model_form_obj: dic = {"is_popup": False, "item": bfield} # 每一个bfield就是Form的字段,是一个对象 if isinstance(bfield.field, ModelChoiceField): # print(bfield.field,"popup按钮") print(bfield, type(bfield)) # <class 'django.forms.boundfield.BoundField'> releated_model_name = bfield.field.queryset.model # 找到关联的类名 app_model_name = releated_model_name._meta.app_label, releated_model_name._meta.model_name # 找到应用名和类名(目的是拼接url) base_url = reverse("stark:%s_%s_add" % (app_model_name)) popup_url = "%s?_popupbackid=%s" % (base_url, bfield.auto_id) #每一个input框的id print(bfield.auto_id,"111111") dic["is_popup"] = True dic["popup_url"] = popup_url new_form.append(dic) return {"form":new_form} #返回的这个form是给了"stark/form.html"它里面的form,然后循环遍历
stark/form.html
使用
<form method="post" class="form-horizontal" novalidate> {% csrf_token %} {% for dic in form %} #使用 <div class="col-sm-6"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">{{ dic.item.label }}</label> <div class="col-sm-10" style="position: relative"> {{ dic.item }} {% if dic.is_popup %} <div style="position: absolute;right: -5px;top: 8px;z-index: 9999"> <a onclick="popUp('{{ dic.popup_url }}')" class="glyphicon glyphicon-plus"></a> <!--注意要加引号,不然就会被当成变量了--> </div> {# 判断如果是MOdelChoicesField是Fk#} {# 判断如果是MOdelChoicesField是Fk#} {% endif %} {{ dic.item.errors.0 }} </div> </div> </div> {% endfor %} <div class="col-sm-offset-11 col-sm-1"> <input type="submit" class="btn btn-primary" value="提交"> </div> </form> <script> function popupCallback(data) { var op = document.createElement("option"); op.value = data.id; op.text = data.text; op.setAttribute("selected","selected"); document.getElementById(data.popupbackid).appendChild(op) } function popUp(url) { var popupPage = window.open(url, url, "status=1, height:500, 600, toolbar=0, resizeable=0"); } </script>