在Django url模板标签中获取javascript变量的值

时间:2013-07-24 11:07:07

标签: javascript django url

众所周知,使用django模板标签“url”有一种直接指向URL的DRY方式,比如说

{% url "someview" arg1=X %}

在这里,我希望“X”是javascript变量的值,比如说tmp。但以下不起作用

<script>
    ...{% url "someview" arg1=tmp %}...
</script>

我应该如何获取模板标签内的值?

6 个答案:

答案 0 :(得分:56)

我发现了一种在大多数情况下可能有效的技巧:

var url_mask = "{% url 'someview' arg1=12345 %}".replace(/12345/, tmp.toString());

它很干净,并没有打破DRY原则。

答案 1 :(得分:5)

只是说清楚,以便下一个读者可以有一个全面的解决方案。关于这个问题,这就是我使用Mike Lee解决方案的一个例子,它使用Javascript重定向到一个名为 tmp 的变量中的参数的新页面:

window.location = "{% url 'your_view_name' 1234 %}".replace(/1234/, tmp.toString());

答案 2 :(得分:0)

我认为您无法使用JavaScript中的{% url %}命名参数,但是您可以执行位置参数或查询字符串参数:

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

但是,最初渲染模板时,你只能这样做一次。

答案 3 :(得分:0)

一种简单的方法是

<div id="test" style="display: none;">
 {% url 'some_url:some_sub_url'%}
</div>


<script>
  url_mask = $( "#test" ).html()
</script>

答案 4 :(得分:0)

var name = "{% url 'your_view_name' pk=0 %}".replace('0', name_variable);

答案 5 :(得分:0)

使用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。