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

IT技术 javascript django url
2021-02-07 01:34:18

众所周知,有一种使用 django 模板标签“url”定向到 URL 的 DRY 方式,例如

{% url "someview" arg1=X %}

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

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

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

6个回答

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

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

它很干净,而且不违反 DRY 原则。

好主意 - 值得注意的是,这仅在arg1可以是数字的情况下才有效,并且如果反向 URL 不包含字符串“/12345/”的其他实例。
2021-03-21 01:34:18
我曾尝试使用应用程序名称并使用 django 1.11,但它不起作用,var href = "{% url 'Myaap:report_page' args1=0 %}".replace(/0/, temp_location.toString())
2021-03-22 01:34:18
@DominicRodger 值 12345 只是各种占位符,如果反向 URL 确实包含该占位符,则将其更改为不存在的内容就足够了。如果 arg1 不能是数字,为什么它不起作用?
2021-03-24 01:34:18
我已经尝试过这个,但在我的情况下没有任何效果,它在替换发生之前识别 url。"var url_mask = "{% url 'someview' pk=12345 %}".replace(/12345/, "1");"
2021-04-09 01:34:18
我确实喜欢这个,它对我有用, var url_mask = "{% url 'someview' 12345 %}".replace(/12345/, tmp.toString());
2021-04-10 01:34:18

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

window.location = "{% url 'your_view_name' 1234 %}".replace(/1234/, tmp.toString());
@MeL 这一切都取决于您要完成的工作。你的情况是什么?
2021-03-17 01:34:18
直到将 1234 放在单引号之间才对我有用:'1234'。
2021-04-04 01:34:18
在我的 html 模板中到底需要做什么?
2021-04-14 01:34:18

一种简单的方法是

<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 在这里。