我正在尝试实现 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 ''
但是这个 context['dom_ready'] 只适用于相同的模板(我的意思是,我可以在 some_other_file.html 中执行 {{ dom_ready }}
,但我在 main 中看不到它。 html(可能是因为它们有不同的渲染上下文或什么?)。
谢谢。
最佳答案
如您所料,渲染上下文不会在模板文件之间共享。
您可以通过在定义模板标签的地方使用模块级变量来解决您的问题。
只需添加
dom_ready = []
到文件的顶部,然后将上下文 ['dom_ready'] 替换为 dom_ready。
您知道您可以多次调用 $.ready 吗?这可能比使用模板标签实现这一点更简单、更清晰。
关于javascript - 在 Django 中的两个自定义标签之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119897/