Javascript 如何在Django模板中执行此操作
现在这将是一个有点奇怪的用例。也许有人有一些想法 背景 我正在写一个非常AJAX密集的网站。事实上,几乎没有任何完整的页面重新加载。这意味着大量的模板合成是在客户端完成的。目前,我在jQuery中使用了一些自行编写的脚本。为了使事情合理地简单,我只使用变量占位符,比如:Javascript 如何在Django模板中执行此操作,javascript,django,templates,django-templates,dry,Javascript,Django,Templates,Django Templates,Dry,现在这将是一个有点奇怪的用例。也许有人有一些想法 背景 我正在写一个非常AJAX密集的网站。事实上,几乎没有任何完整的页面重新加载。这意味着大量的模板合成是在客户端完成的。目前,我在jQuery中使用了一些自行编写的脚本。为了使事情合理地简单,我只使用变量占位符,比如:{{somevar.someattr.someotherattr}}。我可能会用胡子之类的东西来实现类似的行为 另一方面,有时我喜欢能够在服务器端进行一些合成。我正在寻找一种方法来避免客户端和服务器端无意义的代码重复 创意 我希望
{{somevar.someattr.someotherattr}}
。我可能会用胡子之类的东西来实现类似的行为
另一方面,有时我喜欢能够在服务器端进行一些合成。我正在寻找一种方法来避免客户端和服务器端无意义的代码重复
创意
我希望能够以这样的方式呈现Django模板,使输出中的某些间隙保持不变。更具体地说,如果模板呈现上下文中未提供给定变量,则占位符仍应为{{contents}
。我想知道使用过滤器和/或标签是否可以实现这种或类似的行为
我可以只写
{{somevar.someattr}}默认值:{{{somevar.someattr}}}
,然而,这并不是很枯燥。我不知道Django,但可能值得一看的是javaScriptMVC:我不知道Django,但可能值得一看的是javaScriptMVC:如果模板字符串无效,您可以将设置为{%s}
如果无效,您可以将模板\u字符串设置为{{%s}
这就是我最后想到的:
代码:
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 %}
用法:
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 %}
这是一个黑客,但不是一个造成实际麻烦的大黑客。另外,我认为它是线程安全的,但是还没有在这方面进行测试。这就是我最后想到的:
代码:
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 %}
用法:
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 %}
这是一个黑客,但不是一个造成实际麻烦的大黑客。另外,我认为它是线程安全的,但是还没有在这方面进行测试。这就是我在Django+ICanHaz.js中使用的。使用此选项,您可以使用过滤器或标记:
这是我在Django+ICanHaz.js中使用的。使用此选项,您可以使用过滤器或标记:
这很有趣。然而,试图使用它实际上会迫使我完全重写应用程序。据我所知,这迫使我将一个应用程序设计成一个严格的SOFEA,我现在还没有准备好。好吧,我最后没有使用jmvc,但是你的一句话激励我对可用的东西做了更深入的研究,我发现了Backbone.js
,这在某种意义上有很多共同点。我真的很高兴我找到了它。可能为我节省了很多时间,所以谢谢你。这很有趣。然而,试图使用它实际上会迫使我完全重写应用程序。据我所知,这迫使我将一个应用程序设计成一个严格的SOFEA,我现在还没有准备好。好吧,我最后没有使用jmvc,但是你的一句话激励我对可用的东西做了更深入的研究,我发现了Backbone.js
,这在某种意义上有很多共同点。我真的很高兴我找到了它。可能为我节省了很多时间,所以谢谢你。。。。然而,这似乎只是为了调试目的和一个全局设置,对吗?这是建议的事情,特别是如果你正在使用其他应用程序,如Admin。但我发现它不会破坏任何东西。我提到它是因为它就在那里。这取决于你选择它如何影响你。我想我会使用一些黑客围绕这个功能。。。。然而,这似乎只是为了调试目的和一个全局设置,对吗?这是建议的事情,特别是如果你正在使用其他应用程序,如Admin。但我发现它不会破坏任何东西。我提到它是因为它就在那里。这取决于你选择它对你的影响。我想我会在这个功能上使用一些技巧。很好,我一定会尝试一下。我有一个问题。这也处理导入标记吗?街区扩展怎么样?很好,我一定要试试。我有个问题。这也处理导入标记吗?街区扩建怎么样?