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。使用main
、all_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)的主要内容,如果未能解决你的问题,请参考以下文章
Heroku/Django:没有名为 dj_database_url 的模块
ImportError:导入 dj_database_url ImportError:没有名为“dj_database_url”的模块