使用jQuery Ajax时如何在模板中编写Django URL?

时间:2018-03-19 16:58:58

标签: jquery ajax django django-templates

我一直都读到,当你在Django中编码时,你应该遵循DRY principle并且只在一个地方硬编码你的URL,通常是urls.py文件。但是,如果您将URL传递给jQuery Ajax函数,如何在Django模板中编写URL?我读过的关于在Django模板中使用Ajax的每篇在线文章都将URL显示为硬编码。

在我的例子中,模板使用Bootstrap在用户按下按钮时显示模态窗口。我的profile.html模板包含以下jQuery代码:

<html>
    # ...
    <script>
      $(function() {
        var url = '/profile/view/member-lists/{{ viewer_id }}/{{ viewed_id }}/{{ viewed_type_id }}';
        $('#exampleModal').on('show.bs.modal', function(e) {
          $.ajax(url, {
            url: url,
            type: 'GET',
            dataType: 'json',
            success: function(data) {
              // Do something
            },
            error: function(data) {
              // Raise error
            },
          });
        });
      });
    </script>
</html>

我尝试了以下各种表达网址的方法,但没有一种方法可以使用:

  var url = "{% url 'member-lists' {{ viewer_id }} {{ viewer_type_id }} %}";
  var url = "{% url 'member-lists' viewer_id={{ viewer_id }} viewer_type_id={{ viewer_type_id }} %}";
  var url = "{% url 'member-lists' %}?viewer_id={{ viewer_id }}&viewer_type_id={{ viewer_type_id }}";

当该URL传递给jQuery Ajax函数时,在Django模板中表达URL的正确方法是什么?

更新

我将我的JavaScript网址更改为:

    var url = "{% url 'member-lists' viewer_id=viewer_id viewed_id=viewed_id viewed_type_id=viewed_type_id %}";

我的urls.py文件包含这些urlconf模式:

url(r'^view/member-lists/(?P<viewer_id>\d+)/(?P<viewed_type_id>\d+)/$', get_viewer_member_lists, name='member-lists'),
url(r'^view/member-lists/(?P<viewer_id>\d+)/(?P<viewed_id>\d+)/(?P<viewed_type_id>\d+)/$', get_viewer_member_lists_checked, name='member-lists-checked'),

我输入此网址:

http://localhost:8000/profile/view/1/5/1/

但现在我收到如下所示的错误。我认为我的URL将与上面显示的第二个url模式匹配。

NoReverseMatch at / profile / view / 1/5/1 /

反对&#39;会员列表&#39;参数&#39;()&#39;和关键字参数&#39; {u&#39;已查看&#39;:你&#39; 5&#39;,你&#39;已查看_类型&#39;:你&#39; 1&#39;,你&#39; viewer_id&# 39;:你&#39;}&#39;未找到。尝试了1种模式:[&#39; profile / view / member-lists /(?P \ d +)/(?P \ d +)/ $&#39;]

有什么我不了解Django的网址模式匹配吗?

我弄明白了这个问题。网址模式名称需要是&#34;成员列表检查&#34;而不是&#34;成员列表&#34;。

1 个答案:

答案 0 :(得分:0)

就这样称呼它:

var url = "{% url 'member-lists' viewer_id=viewer_id  viewer_type_id=viewer_type_id viewed_type_id=viewed_type_id %}";

无需使用双花括号。

BTW,请注意您没有通过viewed_type_id,我不知道您的urls.py是否需要这样做。如果不起作用,请发布您的urls.py