You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django路由分层后POST表单提交出现404错误咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:24:53