Django路由分层后POST表单提交出现404错误咨询
我来帮你搞定这个问题!你遇到的核心问题是:把路由从项目级urls.py迁移到应用级后,表单提交时请求URL错误地指向了/read_write_app/add_users/index.html,而不是正确的/read_write_app/add_users/,导致Django找不到对应的路由规则,返回404错误。
问题根源
这几乎可以肯定是你的add_users.html模板里的表单action属性设置不当造成的——比如你可能把action设成了index.html或者相对路径,浏览器会把它拼接到当前页面的URL后面,生成了一个不存在的路径。
解决方案
1. 修正模板中的表单action属性
推荐用Django的模板标签来生成正确的URL,避免硬编码路径:
<form method="POST" action="{% url 'read_write_app:add_users' %}"> {% csrf_token %} <!-- 你的表单字段内容 --> </form>
这里的read_write_app是你在应用级urls.py里设置的app_name,add_users是路由的name属性,Django会自动帮你生成正确的/read_write_app/add_users/路径。
如果表单就是在当前页面提交,也可以直接留空action:
<form method="POST" action=""> {% csrf_token %} <!-- 你的表单字段内容 --> </form>
这种方式会自动提交到当前页面的URL,同样能解决问题。
2. 优化视图的成功返回逻辑
你当前在表单验证成功后直接调用index(request)返回响应,虽然能显示页面,但URL不会改变。推荐使用Django的redirect重定向,这更符合HTTP最佳实践:
from django.shortcuts import redirect def add_users(request): form = AddUserDetailsForm() if request.method == 'POST': form = AddUserDetailsForm(request.POST) if form.is_valid(): # 你的表单处理逻辑... form.save(commit=True) # 重定向到首页,用路由name更灵活 return redirect('index') else: print('ERROR FORM INVALID') return render(request,'read_write_app/add_users.html',{'form':form})
如果后续把index也迁移到应用级路由,只需要改成redirect('read_write_app:index')即可。
原问题相关代码与错误信息
views.py代码
def index(request): return render(request,'read_write_app/index.html') def add_users(request): form = AddUserDetailsForm() if request.method == 'POST': form = AddUserDetailsForm(request.POST) if form.is_valid(): print('Validation Success') print('FIRST_NAME : '+form.cleaned_data['first_name']) print('MIDDLE_NAME : '+form.cleaned_data['midlle_name']) print('LAST_NAME : '+form.cleaned_data['last_name']) print('GENDER : '+form.cleaned_data['gender']) print('EMAIL : '+form.cleaned_data['email']) form.save(commit=True) return index(request) else: print('ERROR FORM INVALID') return render(request,'read_write_app/add_users.html',{'form':form}) def view_users(request): user_list = User.objects.order_by('email') user_dict = {'users':user_list} return render(request,'read_write_app/view_users.html',context=user_dict)
应用级urls.py代码
app_name = 'read_write_app' urlpatterns=[ re_path(r'^view_users/$',views.view_users,name='view_users'), re_path(r'^add_users/$',views.add_users,name='add_users'), ]
项目级urls.py代码
urlpatterns = [ re_path(r'^$',views.index,name='index'), path('admin/', admin.site.urls), re_path(r'^read_write_app/',include('read_write_app.urls')), ]
错误信息
页面未找到(404)
请求方法: POST
请求URL: http://127.0.0.1:8000/read_write_app/add_users/index.html
Django按以下顺序尝试了这些URL模式:
^$ [name='index']
admin/
^read_write_app/ ^view_users/$ [name='view_users']
^read_write_app/ ^add_users/$ [name='add_users']
当前路径read_write_app/add_users/index.html与上述模式均不匹配。
终端日志
[30/Aug/2019 15:08:20] "GET /read_write_app/add_users/ HTTP/1.1" 200 2173 Not Found: /read_write_app/add_users/index.html [30/Aug/2019 15:08:29] "POST /read_write_app/add_users/index.html HTTP/1.1" 404 2563
内容的提问来源于stack exchange,提问作者Bhaskar Kherkatary

