Django中的URL模式匹配
我在尝试访问 http://127.0.0.7:8000/edit-paragraph/6/edit/ 时,出现了“页面未找到”的错误,具体错误信息如下:
Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:
^admin/
^login/$
^login/home/
^logout/$
^edit-section/(?P<s_id>\d+)/edit/
^edit-section/(?P<s_id>\d+)
^edit-paragraph/(?P<p_id>\d+)/edit/
The current URL, edit-paragraph/6/, didn't match any of these.
在我的 urls.py 文件中,我有:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
(r'^login/$', 'mysite.auth.views.login_user'),
(r'^login/home/', 'mysite.auth.views.logged_in'),
(r'^logout/$', 'mysite.auth.views.logout_user'),
(r'^edit-section/(?P<s_id>\d+)/edit/', 'mysite.auth.views.edit_section_form'),
(r'^edit-section/(?P<s_id>\d+)', 'mysite.auth.views.edit_section'),
(r'^edit-paragraph/(?P<p_id>\d+)/edit/', 'mysite.auth.views.edit_paragraph')
)
我觉得这个网址 http://127.0.0.7:8000/edit-paragraph/6/edit/ 应该能和我 URL 配置的最后一行匹配。你们觉得我哪里做错了吗?它能匹配一些相似的网址:
r'^edit-section/(?P<s_id>\d+)/edit/'
提前谢谢你们!
编辑:
结果发现它在重定向。现在我有了这个,浏览器却又给了我一个“页面未找到”的错误:
@login_required
def edit_paragraph(request, p_id):
p = get_object_or_404(Paragraph, id=p_id)
if request.method == 'POST':
form = ParagraphForm(request.POST)
if form.is_valid():
p.title = request.POST['title']
p.description = request.POST['description']
p.save()
return HttpResponse('foo')
else:
form = ParagraphForm({ 'title': p.title, 'description': p.description })
return render_to_response('auth/edit-paragraph.html', { 'form': form }, context_instance=RequestContext(request))
return HttpResponseRedirect('/edit-paragraph/'+p_id+'/edit/')
编辑 - 已解决:
这是我想出的解决办法,避免了无限循环和其他出现的问题:
@login_required
def edit_paragraph(request, p_id):
p = get_object_or_404(Paragraph, id=p_id)
form = ParagraphForm({ 'title': p.title, 'description': p.description })
if request.method == 'POST':
form = ParagraphForm(request.POST)
if form.is_valid():
p.title = request.POST['title']
p.description = request.POST['description']
p.save()
return HttpResponseRedirect('/login/home')
return render_to_response('auth/edit-paragraph.html', { 'form': form }, context_instance=RequestContext(request))
1 个回答
0
有几点需要注意:
如果你被重定向了,先确认一下是不是确实被重定向,而不是你的浏览器在自动填网址时太过于热心。
你可以用网页开发工具(比如firebug、网页检查器等)来查看是否真的发生了重定向。
很多浏览器在处理网址末尾的/
时会有一些奇怪的表现。你可以尝试在一个浏览器之前没有访问过的端口上运行你的开发服务器(比如说manage.py runserver 8001
),然后再试一次。如果在你的
urls.py
文件中或者在视图函数之前发生了异常,可能导致网址模式没有被正确评估,这样Django就会认为你访问的页面是404(找不到)。在你的情况中,这似乎没有发生,因为Django告诉你它正在检查哪些网址。不过,你可以尝试在控制台中导入你的settings.py
、urls.py
和views.py
文件,然后直接运行你的视图函数,确保没有出现异常。