在 Django url 模板标签中获取 javascript 变量的值
Posted
技术标签:
【中文标题】在 Django url 模板标签中获取 javascript 变量的值【英文标题】:Get javascript variable's value in Django url template tag 【发布时间】:2013-07-23 19:43:17 【问题描述】:众所周知,有一种 DRY 方式可以通过使用 django 模板标签“url”来定向到 URL,比如
% url "someview" arg1=X %
在这里,我希望“X”成为 javascript 变量的值,例如 tmp
。但以下不起作用
<script>
...% url "someview" arg1=tmp %...
</script>
我应该如何获取模板标签内的值?
【问题讨论】:
你可以试试:% url 'someview' %?arg1=tmp
你确定这是对的吗?好像有语法错误。
对不起,我忘了tmp
是javascript变量,所以:<script> var href = '% url 'someview' %?arg1=' + tmp; </script>
恐怕还是不行。 Django url 不能以这种方式工作。说我的“someview”网址就像“^(?P\d+)/somethingelse...$”
@Marii 仅在您使用 get 参数时才有效,而不是 post
【参考方案1】:
我发现了一个可能在大多数情况下都有效的技巧:
var url_mask = "% url 'someview' arg1=12345 %".replace(/12345/, tmp.toString());
干净,不违反 DRY 原则。
【讨论】:
好主意 - 值得注意的是,这只有在arg1
可以是数字并且反向 URL 不包含字符串“/12345/”的其他实例时才有效。
@DominicRodger 值 12345 只是某种占位符,如果反向 URL 确实包含该占位符,则将其更改为不存在的内容就足够了。如果 arg1 不能是数字,为什么它不起作用?
我已经尝试过了,但在我的情况下没有任何效果,它会在替换发生之前识别 url。 "var url_mask = "% url 'someview' pk=12345 %".replace(/12345/, "1");"
我尝试过使用 App 名称并使用 django 1.11,它不起作用,var href = "% url 'Myaap:report_page' args1=0 %".replace(/0/, temp_location. toString())
我确实喜欢这个,它对我有用,var url_mask = "% url 'someview' 12345 %".replace(/12345/, tmp.toString());
【参考方案2】:
只是说清楚,以便下一个读者可以有一个全面的解决方案。关于这个问题,这就是我如何将 Mike Lee 解决方案用于一个示例案例,该案例使用 Javascript 重定向到一个新页面,其中一个名为 tmp 的变量中的参数:
window.location = "% url 'your_view_name' 1234 %".replace(/1234/, tmp.toString());
【讨论】:
我的 html 模板中到底有什么内容? @MeL 这完全取决于您要完成的工作。你的情况是什么? 直到将 1234 放在单引号之间才对我有用:'1234'。【参考方案3】:一个简单的方法是
<div id="test" style="display: none;">
% url 'some_url:some_sub_url'%
</div>
<script>
url_mask = $( "#test" ).html()
</script>
【讨论】:
【参考方案4】:var name = "% url 'your_view_name' pk=0 %".replace('0', name_variable);
【讨论】:
【参考方案5】:使用concat
而不是replace
的类似解决方案,因此您可以避免id
冲突:
var pre_url = "% url 'topology_json' %";
var url = pre_url.concat(tool_pk, '/', graph_depth, '/');
但是你需要一个非参数的 url 来让 Django 对 pre_url
感到满意,因为加载时评估,我的 urls.py
是:
urlpatterns = [
url(r'^topology_json/$',
views.topology_json,
name='topology_json'),
url(r'^topology_json/(?P<tool_id>[0-9]+)/(?P<depth>[0-9]+)/$',
views.topology_json,
name='topology_json'),
...
]
并且视图中的参数有合适的默认值,所以views.py
:
def topology_json(request, tool_id=None, depth=1):
"""
JSON view returns the graph in JSON format.
"""
if tool_id:
tool = get_object_or_404(Tool, pk=tool_id)
topology = get_graph(str(tool), int(depth))
else:
...
这里还有 1.11 的 Django。
【讨论】:
【参考方案6】:我认为您不能使用 JavaScript 中的 % url %
命名参数,但是您可以使用位置参数或查询字符串参数:
<script type="text/javascript">
var tmp = window.location.hash, //for example
url = % url '[url_name]' % + tmp + '/';
</script>
但是,您只能在模板最初呈现时执行一次。
【讨论】:
是的,我想出了一个类似的技巧。类似 var url_mask = "% url 'someview' arg1=12345 %".replace(/12345/, tmp.toString()); 酷。您始终可以回答自己的问题,这对其他人在将来查看此问题时很有帮助。以上是关于在 Django url 模板标签中获取 javascript 变量的值的主要内容,如果未能解决你的问题,请参考以下文章
Django url 标签和reverse()函数的使用(转)