获取javascript变量'Django url模板标记中的s值

Get javascript variable's value in Django url template tag

本文关键字:url 变量 javascript Django 获取      更新时间:2023-09-26

众所周知,有一种DRY方式可以通过使用django模板标签"URL"来引导到URL,比如

{% 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。

我认为您不能从JavaScript中使用{% url %}的命名参数,但您可以使用位置参数或查询字符串参数:

<script type="text/javascript">
    var tmp = window.location.hash, //for example
        url = {% url '[url_name]' %} + tmp + '/';
</script>

但是,在最初渲染模板时,只能执行一次此操作。