【问题标题】:Get javascript variable's value in Django url template tag在 Django url 模板标签中获取 javascript 变量的值
【发布时间】: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变量,所以:&lt;script&gt; var href = '{% url 'someview' %}?arg1=' + tmp; &lt;/script&gt;
  • 恐怕还是不行。 Django url 不能以这种方式工作。说我的“someview”网址就像“^(?P\d+)/somethingelse...$”
  • @Marii 仅在您使用 get 参数时才有效,而不是 post

标签: javascript django url


【解决方案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());
        • 酷。您始终可以回答自己的问题,这对其他人在将来查看此问题时很有帮助。
        猜你喜欢
        • 2016-05-30
        • 2021-02-15
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2019-07-31
        相关资源
        最近更新 更多