Django表单渲染results页面遇NoReverseMatch错误求助
解决Django表单提交后
NoReverseMatch找不到'results'视图的问题 嘿,我来帮你排查这个问题!你遇到的NoReverseMatch错误是Django里常见的URL配置问题,加上你的results视图还有个小bug,我给你一步步说明怎么修复:
1. 核心问题:URL命名空间未正确使用
你在mapping_twitter/urls.py里设置了app_name = 'mapping_twitter',这就给这个应用的URL加上了专属命名空间。当你用reverse()生成跳转URL时,必须带上这个命名空间,否则Django无法区分不同应用下同名的视图。
修复代码(views.py):
把search_query函数里的反向解析代码修改一下:
# 原来的代码 # return HttpResponseRedirect(reverse('results')) # 修改后的代码 return HttpResponseRedirect(reverse('mapping_twitter:results'))
2. 次要问题:results视图未定义form变量
你的results视图中尝试把form变量传入模板,但这个视图里根本没有定义form,运行起来会触发NameError。
修复代码(views.py):
如果结果页面需要显示表单,就初始化一个空表单;不需要的话直接去掉这个变量:
def results(request): # 初始化空表单(如果需要的话) form = SearchQueryForm() context = {'form': form} return render(request, 'mapping_twitter/results.html', context) # 或者不需要表单的话简化成: # def results(request): # return render(request, 'mapping_twitter/results.html', {})
验证URL结构
最后确认下你的URL层级是正确的:
- 根URL配置把
/search_query/指向mapping_twitter的URLs mapping_twitter里的results/路径对应results视图,所以完整的结果页面URL是/search_query/results/,加上命名空间后reverse就能正确生成这个地址了。
附原始问题信息:
错误信息
NoReverseMatch at /search_query/ Reverse for 'results' not found. 'results' is not a valid view function or pattern name. Request Method: POST Request URL: http://ozxlitwi.apps.lair.io/search_query/ Django Version: 2.0 Exception Type: NoReverseMatch Exception Value: Reverse for 'results' not found. 'results' is not a valid view function or pattern name. Exception Location: /mnt/data/.python-3.6/lib/python3.6/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 632 Python Executable: /mnt/data/.python-3.6/bin/python Python Version: 3.6.5 Python Path: ['/mnt/project', '/mnt/data/.python-3.6/lib/python36.zip', '/mnt/data/.python-3.6/lib/python3.6', '/mnt/data/.python-3.6/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6', '/mnt/data/.python-3.6/lib/python3.6/site-packages'] Server time: Fri, 1 Jun 2018 10:00:20 +0900
views.py代码
def search_query(request): # If POST request, process the Form data: if request.method == 'POST': # Create a form instance and populate it with the data from the request (binding): form = SearchQueryForm(request.POST) # Check if the form is valid: if form.is_valid(): form.save() return HttpResponseRedirect(reverse('results')) else: form = SearchQueryForm() context = {'form':form} return render (request, 'mapping_twitter/search_query.html', context) def results(request): context = {'form':form} return render(request, 'mapping_twitter/results.html', context)
mapping_twitter/urls.py代码
from django.urls import path from . import views app_name = 'mapping_twitter' urlpatterns = [ path('', views.search_query, name='search-query'), path('results/', views.results, name='results'), ]
mapping_data/urls.py代码
urlpatterns = [ path('search_query/', include('mapping_twitter.urls')), path('admin/', admin.site.urls), path('', RedirectView.as_view(url='/search_query', permanent=True)), ]
mapping_twitter/results.html代码
<!--- DRAFT ---> Display search results here
内容的提问来源于stack exchange,提问作者user9330449
相关产品推荐
相关产品推荐

