如何创建一个在块外工作的自定义Django模板标签?

时间:2012-02-12 13:56:57

标签: django django-templates

在我的项目中,我需要根据几个参数不同地处理CSS需求。因此,与可用的静态管理系统相比,我需要一个额外的抽象级别。

在我的模板中,我希望能够使用看似{% register_css 'myfile.css' %}的模板标记来注册CSS(和JS)要求。这种方法就像一个魅力。

但是,这种方法仍然存在一个问题:标签在插入块时工作得很好,但在插入子模板时从不被调用。标签定义是:

@register.simple_tag(takes_context = True)
def register_css(context, *args):
    context['static_registry'].register_css(streamlet)
    return ''

这是我的测试模板:

{% extends main_skelton %}
{% load static_registry %}
{% register_css 'base' %}

{% block title %}Welcome{% endblock %}

{% block content %}
{% register_css 'home' %}
<p>Some content here</p>
{% endblock %}

在该模板中,'home'css被注册,但不是'base'。我怎么能兼得?

谢谢!

1 个答案:

答案 0 :(得分:3)

在基本模板中加入空{% block init %},然后在子模板中覆盖该块以注册文件 - {% block init %}{{ block.super }} {% register_css 'foo %}{% endblock %}

潜在的问题是,在子模板中,只会呈现与父模板中的某些内容匹配的块。 AFAIK没有简单的方法,但使用虚拟块可以正常工作。