自定义标签和过滤器
1.在settings中的installed_apps配置当前的app,不然django无法找到自定义的simlple_tag,
2.在app中创建templatetags模块(模块名只能是templatetags)
3.创建任意的.py文件,如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = tmplate.Library() @register.filter def filter_muliti(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)
在使用自定义simple_tag和filter的html文件中导入创建的my_tags.py
{%load my_tags%}
使用simple_tag和filter(如何调用)
------------------html {%load xxxxx%} #num=12 {{num|filter_multi:2 }}#24 {{num | filter_multi:"[22,333,444]"}} {%simple_tag_multi 2 5%}参数不限 但不能放在if for语句中 {%simple_tag_multi 5%}
注意:fiter可以用在if语句之后,simple_tag 不可以
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
模板继承extend
django模板引擎中最强大的也最复杂的部分就是模板继承了,模板继承可以让您继承一个基本的“骨架”模板,它包含您站点中的全部元素,并且可以定义能够被子模板覆盖的bolcks
例子:
<!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>
这个模板,我们把它叫做base.html,它定义了一个可以用于两列排版的简单的HTML框架。“子模板”的工作是用他们填充空的blocks。
在这个例子中,block标签定义了三个可以被子模板填充内容的block,bolck告诉模板引擎,子模板可能会覆盖掉模板中的这些位置。
子模板是这样的:
{% 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 %}
extends标签是这里的关键。它告诉模板引擎,这个模板“继承”了另一个模板,当模板系统处理这个模板时,首先,它将定位父模板--在此例中,就是base.htmL
那时,模板引擎注意到base.htmL中的三个block标签,并用子模板中的内容来替换block,根据blog_entries的值,输出是这样的:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>My amazing blog</title> </head> <body> <div id="sidebar"> <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> </div> <div id="content"> <h2>Entry one</h2> <p>This is my first entry.</p> <h2>Entry two</h2> <p>This is my second entry.</p> </div> </body> </html>
请注意子模板没有定义sidebar block,所以系统使用了父模板中的值。父模板的{%block%}标签中的内容总是被用作备选内容{fallblock}
这种方式使代码得到最大程度的复用,并且使得添加的内容到共享区域更加简单,例如,部分范围内的导航。
这里使用继承时一些提示:
1.如果你在模板中使用{%extend%}标签,它必须是模板中的一个标签,其他任何情况下,模板继承都无法工作。
2.在base模板中设置越多{%block%}标签越好,请记住。子模板不必定义全部的父模板中的blocks,所以,你可以在大多数的blocks中填充合理的默认的内容,然后,只定义你需要的哪一个。多一点钩子总比少一点的好。
3.如果你发现你自己在大量的模板中复制内容,那可能意味着你应该把内容移动到一个父模板中的一个{%block%}中。
4.为了更好的可读性,你也可以给你的{%block%}标签起一个名字,例如:
{%block content%}
...
{%endblock content%}
在大型的模板中, 你可以清楚的看到哪一个{%block%}标签被关闭了
最后,请注意并不能在一个模板中定义多个相同名字的{%block%}标签。这个限制的存在时因为block标签的作用是“双向”的。这个意思是:block标签不仅提供了一个坑去填,它还在父模板中定义了填坑的内容,如果在一个模板中有两个名字一样的block标签,模板中的父模板不知道使用哪个block内容。
浙公网安备 33010602011771号