AJAX路由到Django URL(使用Django 2.0“ path” urlpatterns)

时间:2019-02-23 21:44:46

标签: ajax django

在Django 2.0将url模式从“ url”更改为“ path”之前,这种方法一直有效:

index.html

<!DOCTYPE html>
  {% load static %}
  <head>
      <script type="text/javascript" src="{% static 'main/js/jquery-3.3.1.js' %}">
  </head>
  <body>
      <div id='test'>
        <p><button class="btn">Click Here!</button></p>
      </div>
  <script>
      $('.btn').click(function(){
      console.log('button is clicked!')
      $.ajax({
          url: 'main/all_json',
          sucess: function(serverResponse){
          console.log('success.serverResponse', serverResponse)
    }
  })  
});

APP LEVEL urls.py

urlpatterns = [
  url(r'^all_json$',views.all_json, name="all_json")
  ]

项目级别urls.py

app_name= "main"

urlpatterns = [
    path('', include ('apps.main.urls', namespace='main')),
    path('admin/', admin.site.urls),
]

views.py

def all_json(request):
    return HttpResponse ('hello world!')

但是现在,Django 2.0使用“路径”而不是url regex模式。当我使用路径时:

app_name= "name"

urlpatterns = [
path('all_json',views.all_json, name="all_json"),
]

我得到了:

  

获取http://127.0.0.1:8000/main/all_json 404(未找到)

我查看了new documentationrelease notes,有一些SO答案解释了如何使用它们SO post 1SO post 2。到目前为止,这是有用的,在这里我无法将URL从AJAX函数传递到“路径”。

我是AJAX的新手,并且习惯于在Django中使用{% url main:all_json %}进行操作。但是我相信使用AJAX不能使用这种表示法。是吗?

由于某种原因,我在Django 2.0工作之前使用url(r'^$') urlpatterns的示例,但是现在使用“ path”时,我得到了代码404。可用的大多数问题和教程都是Django 2.0之前的版本,并使用url(r'^$') urlpatterns。发行说明和文档没有提及有关使用AJAX的区别。

我的问题如下:

我还需要在模板和/或urls.py中添加其他内容来帮助其找到url(摆脱404)吗?

2 个答案:

答案 0 :(得分:3)

首先,url在Django 2.0中仍然完全有效。在更高的版本中,可以使用与re_path完全相同的功能。

但是,问题不存在。这是因为您在新版本中添加了最后的斜杠,而以前没有。删除它:

path('all_json', ...)

,或者最好将其添加到Ajax调用中:

url: 'main/all_json/',

最后请注意,由于Ajax脚本直接位于模板文件中,因此绝对可以在其中使用{% url %}标签。

答案 1 :(得分:0)

尝试构建清晰而有用的API。使用Airplane ——— (1,N) ——— Send ——— (1,1) ——— Location 时,main的名称不清楚。不过,让我们尝试您的示例:

  1. 在您的all_json中使用urls.pymain/all_json/。根据文档进行编码:
  

由于每个URL都有该斜线,因此无需添加斜线。例如,它是文章,而不是/ articles。 link

     

...每种模式都要求URL以斜杠结尾。 link

  1. 在您的HTML模板中(顺便说一句,可能是错误的,但您将其命名为name="all_json"。我建议将其重构为html.py),在js块中使用模板标记{ {1}}像:

    somename.html

    })

通过使用{% url "all_json"" %}模板标记,您可以避免在更改网址时出现很多错误。