在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 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的示例,但是现在使用“ path”时,我得到了代码404。可用的大多数问题和教程都是Django 2.0之前的版本,并使用url(r'^$')
urlpatterns。发行说明和文档没有提及有关使用AJAX的区别。
我的问题如下:
我还需要在模板和/或urls.py中添加其他内容来帮助其找到url(摆脱404)吗?
答案 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
的名称不清楚。不过,让我们尝试您的示例:
all_json
中使用urls.py
和main/all_json/
。根据文档进行编码:由于每个URL都有该斜线,因此无需添加斜线。例如,它是文章,而不是/ articles。 link
...每种模式都要求URL以斜杠结尾。 link
在您的HTML模板中(顺便说一句,可能是错误的,但您将其命名为name="all_json"
。我建议将其重构为html.py
),在js块中使用模板标记{ {1}}像:
somename.html
})
通过使用{% url "all_json"" %}
模板标记,您可以避免在更改网址时出现很多错误。