我正在尝试实现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看到它(也许是因为它们有不同渲染上下文或什么?)。
谢谢。
答案 0 :(得分:2)
您猜测渲染上下文不在模板文件之间共享。
您可以使用模块级变量来解决您的问题,您可以在其中定义模板标记。
添加
dom_ready = []
到文件的顶部,然后你有上下文['dom_ready']用dom_ready替换它。
你知道你可以多次拨打$ .ready吗?这可能比使用模板标签实现这一点更简单,更清晰。