众所周知,有一种使用 django 模板标签“url”定向到 URL 的 DRY 方式,例如
{% url "someview" arg1=X %}
在这里,我希望“X”是一个 javascript 变量的值,比如tmp
. 但以下不起作用
<script>
...{% url "someview" arg1=tmp %}...
</script>
我应该如何获取模板标签内的值?
众所周知,有一种使用 django 模板标签“url”定向到 URL 的 DRY 方式,例如
{% url "someview" arg1=X %}
在这里,我希望“X”是一个 javascript 变量的值,比如tmp
. 但以下不起作用
<script>
...{% url "someview" arg1=tmp %}...
</script>
我应该如何获取模板标签内的值?
我发现了一个在大多数情况下可能有效的技巧:
var url_mask = "{% url 'someview' arg1=12345 %}".replace(/12345/, tmp.toString());
它很干净,而且不违反 DRY 原则。
只是说清楚,以便下一位读者可以有一个全面的解决方案。关于这个问题,这是我如何将 Mike Lee 解决方案用于示例案例,该案例使用 Javascript 重定向到一个新页面,该页面的参数位于名为tmp的变量中:
window.location = "{% url 'your_view_name' 1234 %}".replace(/1234/, tmp.toString());
一种简单的方法是
<div id="test" style="display: none;">
{% url 'some_url:some_sub_url'%}
</div>
<script>
url_mask = $( "#test" ).html()
</script>
var name = "{% url 'your_view_name' pk=0 %}".replace('0', name_variable);
类似的解决方案,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:
...
Django 1.11 在这里。