在Django中的两个自定义标记之间传递变量

时间:2011-02-25 16:38:16

标签: javascript jquery python django

我正在尝试实现django模板标记{% domready %}{% enddomready %},它会将其内容记住,记住它,然后标记{% domready_render %}来呈现所有内容。

它看起来像这样:

{# main.html #}
<html>
...
<body>
  ...
  <script>
      (function($) {
          $(document).ready(function() {
              {% domready_render %}
          });
      })(jQuery);
  </script>
</body>
</html>


{# some_other_file.html #}
{% extends main.html %}
..some html...
<a href="" id="link1">Link with onclick</a>
{% domready %}
    $('#link1').click(function() { ... describe here your javascript ... });
{% enddomready %}
..some html...
<a href="" id="link2">Another with onclick</a>
{% domready %}
    $('#link2').click(function() { ... describe here your another javascript ... });
{% enddomready %}
..some html...

所以我的问题是:我该怎么做?我的意思是,这就是我试图做的事情:

@register.tag
def domready(parser, token):
    nodelist = parser.parse(('enddomready',))
    parser.delete_first_token()
    return DomreadyNode(nodelist)

class DomreadyNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        if 'dom_ready' not in context:
            context['dom_ready'] = []

        context['dom_ready'].append(self.nodelist.render(context))
        return ''

@register.tag
def domready_render(parser, token):
    return DomreadyRenderNode()

class DomreadyRenderNode(template.Node):
    def render(self, context):
        if 'dom_ready' in context:
            return u"\n".join(context['dom_ready'])
        return ''

但是这个上下文['dom_ready']只适用于相同的模板(我的意思是,我可以在some_other_file.html中做{{ dom_ready }},但我没有在main.html看到它(也许是因为它们有不同渲染上下文或什么?)。

谢谢。

1 个答案:

答案 0 :(得分:2)

您猜测渲染上下文不在模板文件之间共享。

您可以使用模块级变量来解决您的问题,您可以在其中定义模板标记。

添加

dom_ready = []

到文件的顶部,然后你有上下文['dom_ready']用dom_ready替换它。

你知道你可以多次拨打$ .ready吗?这可能比使用模板标签实现这一点更简单,更清晰。