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

Posted

技术标签:

【中文标题】AJAX 路由到 Django URL(使用 Django 2.0“路径”urlpatterns)【英文标题】:AJAX Routing to Django URLs (Using Django 2.0 "path" urlpatterns) 【发布时间】:2019-07-17 16:41:05 【问题描述】:

这曾经在 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 级别 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 正则表达式模式。当我使用路径时:

app_name= "name"

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

我明白了:

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

我查看了new documentation 和release notes 并且有一些SO 答案解释了如何使用它SO post 1 和SO post 2。到目前为止,这一直很有用,我无法将 url 从 AJAX 函数传递到“路径”。

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

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

我的问题如下:

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

【问题讨论】:

app_name="main" 转到应用级别 urls.py 而不是项目级别 urls.py 【参考方案1】:

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

但是,问题不存在。是你在新版本中添加了一个你以前没有的最后一个斜线。删除它:

path('all_json', ...)

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

url: 'main/all_json/',

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

【讨论】:

感谢您的回复。我很抱歉。我应该提到我尝试了前导和尾随“/”,但没有奏效。我仍然得到 404。 正如我所说,您可以使用 url 标签。但除此之外,请显示您的项目级别 urls.py。 Daniel,我添加了项目级别的 urls.py。我尝试使用 re_path,但是当我在同一个文件中同时使用 path 和 re_path 时,它似乎不喜欢它。对于我在文档中看到的,它是一个或另一个。如果我想使用 re_path 我必须将所有其他路由转换为 url(r'^$') 格式。 嗯,您似乎没有将“main”作为任何 URL 模式的一部分。为什么在 Ajax 调用中使用它?命名空间不是 URL 本身的一部分,新的路径语法也没有改变。 不,你可以混合和匹配 path 和 re_path。【参考方案2】:

尝试构建清晰有用的 API。使用mainall_json 名称不清楚。不过,让我们试试你的例子:

    在您的urls.py 中使用main/all_json/name="all_json"。根据文档:

无需添加前导斜杠,因为每个 URL 都有。例如,它是文章,而不是 /articles。 link

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

    在您的 HTML 模板中(顺便说一句,这可能是错误的,但您将其命名为 html.py。我建议将其重构为 somename.html),在 js 块中使用模板标签 % url "all_json"" %,例如:

    $.ajax(
          url: '% url "all_json" %',
          sucess: function(serverResponse)
          console.log('success.serverResponse', serverResponse)
    
    

    )

使用url模板标签可以避免很多修改url的错误。

【讨论】:

以上是关于AJAX 路由到 Django URL(使用 Django 2.0“路径”urlpatterns)的主要内容,如果未能解决你的问题,请参考以下文章

ajax请求接口里的数据,然后显示在页面里

Heroku/Django:没有名为 dj_database_url 的模块

在heroku上部署路由器的Django多个数据库

django前后端分离部署

ImportError:导入 dj_database_url ImportError:没有名为“dj_database_url”的模块

Django AJAX 请求仅获取最后一个元素(不是 getlist 问题)