寂寞的阿呆

导航

自定义标签和过滤器

 

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内容。

 

posted on 2017-11-21 08:42  寂寞的阿呆  阅读(231)  评论(0)    收藏  举报