如何在Django模板中执行此操作

时间:2011-04-21 23:47:01

标签: javascript django templates django-templates dry

现在这将是一个有点奇怪的用例。也许有人有一些想法。

背景

我正在编写一个非常强大的AJAX网站。实际上几乎没有任何整页重新加载。这意味着在客户端进行了大量的模板组合。目前我在jQuery中使用了一些自编写的脚本。为了使事情变得相当简单,我只使用变量占位符,如:{{ somevar.someattr.someotherattr }}。我可能会使用像胡子这样的东西来实现类似的行为。

另一方面,我不时希望能够在服务器端进行一些组合。我正在寻找一种方法来避免客户端上的无意义代码重复。服务器端。

我希望能够以这样的方式呈现Django模板,输出中的某些间隙将保持不变。更具体地说,如果模板呈现上下文中未提供给定变量,则占位符仍应读取{{ contents }}。我想知道使用过滤器和/或标签是否可以实现这种或类似的行为。

我可以写{{ somevar.someattr|default:"{{ somevar.someattr }}" }},但这不是很干。

4 个答案:

答案 0 :(得分:6)

答案 1 :(得分:1)

我不知道Django,但值得一看的是javaScriptMVC:http://javascriptmvc.com/

答案 2 :(得分:0)

这就是我最终想出来的:

<强>代码:

from django import template

register = template.Library()

@register.filter(name='tmpl')
def tmpl_filter(value, arg=None):
    return value or ("{{ %s }}" % arg)

@register.tag(name='tmpl')
def tmpl_tag(parser, token):
    nodelist = parser.parse(('endtmpl',))
    parser.delete_first_token()
    return UpperNode(nodelist)

class UpperNode(template.Node):
    def __init__(self, nodelist):
        super(UpperNode, self).__init__()
        self.nodelist = nodelist
        nodes = self.get_nodes_by_type(template.VariableNode)
        for n in nodes:
            v = n.filter_expression.var
            if v.lookups:
                for i, f in enumerate(n.filter_expression.filters):
                    print f
                    if f[0] == tmpl_filter and len(f[1]) == 0:
                        n.filter_expression.filters[i] = \
                            (f[0], [(False, '.'.join(v.lookups))],)

    def render(self, context):
        return self.nodelist.render(context)

<强>用法:

{% load placeholders %}
{% tmpl %}
    {{ var.for.template|tmpl }}
    {{ regular.var }}
    {% nestedtag %}
        {{ another.var.for.template|tmpl }}
    {% endnestedtag %}
{% endtmpl %}

这是一个黑客攻击,但不是一个造成实际问题的大问题。另外我认为它是线程安全的,但是在这方面还没有测试过。

答案 3 :(得分:0)

这是我用于Django + ICanHaz.js的内容。有了它,您可以使用过滤器或标签: http://tothinkornottothink.com/post/4282971041/using-jquery-templating-icanhaz-js-with-django