现在这将是一个有点奇怪的用例。也许有人有一些想法。
背景
我正在编写一个非常强大的AJAX网站。实际上几乎没有任何整页重新加载。这意味着在客户端进行了大量的模板组合。目前我在jQuery中使用了一些自编写的脚本。为了使事情变得相当简单,我只使用变量占位符,如:{{ somevar.someattr.someotherattr }}
。我可能会使用像胡子这样的东西来实现类似的行为。
另一方面,我不时希望能够在服务器端进行一些组合。我正在寻找一种方法来避免客户端上的无意义代码重复。服务器端。
观
我希望能够以这样的方式呈现Django模板,输出中的某些间隙将保持不变。更具体地说,如果模板呈现上下文中未提供给定变量,则占位符仍应读取{{ contents }}
。我想知道使用过滤器和/或标签是否可以实现这种或类似的行为。
我可以写{{ somevar.someattr|default:"{{ somevar.someattr }}" }}
,但这不是很干。
答案 0 :(得分:6)
您可以将TEMPLATE_STRING_IF_INVALID
设置为{{%s}}
http://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_STRING_IF_INVALID
答案 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