Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Django模板中执行此操作_Javascript_Django_Templates_Django Templates_Dry - Fatal编程技术网

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

Javascript 如何在Django模板中执行此操作,javascript,django,templates,django-templates,dry,Javascript,Django,Templates,Django Templates,Dry,现在这将是一个有点奇怪的用例。也许有人有一些想法 背景 我正在写一个非常AJAX密集的网站。事实上,几乎没有任何完整的页面重新加载。这意味着大量的模板合成是在客户端完成的。目前,我在jQuery中使用了一些自行编写的脚本。为了使事情合理地简单,我只使用变量占位符,比如:{{somevar.someattr.someotherattr}}。我可能会用胡子之类的东西来实现类似的行为 另一方面,有时我喜欢能够在服务器端进行一些合成。我正在寻找一种方法来避免客户端和服务器端无意义的代码重复 创意 我希望

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

背景

我正在写一个非常AJAX密集的网站。事实上,几乎没有任何完整的页面重新加载。这意味着大量的模板合成是在客户端完成的。目前,我在jQuery中使用了一些自行编写的脚本。为了使事情合理地简单,我只使用变量占位符,比如:
{{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。但我发现它不会破坏任何东西。我提到它是因为它就在那里。这取决于你选择它对你的影响。我想我会在这个功能上使用一些技巧。很好,我一定会尝试一下。我有一个问题。这也处理导入标记吗?街区扩展怎么样?很好,我一定要试试。我有个问题。这也处理导入标记吗?街区扩建怎么样?