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

Django中URL定义错误引发404页面未找到,该如何解决?

Django表单提交404问题解决:带event_id的URL配置与表单处理

问题根源

提交表单时请求URL丢失event_id,核心原因是表单的action未正确指向带event_id的路由,或是URL路由本身未定义带参数的有效路径,导致POST请求匹配不到对应视图。

分步解决方案

1. 确认URL路由配置正确性

项目根URL(es/urls.py)

确保已将item应用的路由正确纳入项目:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('event/', include('event.urls')),
    path('item/', include('item.urls')),  # 必须存在此行,转发/item/开头的请求到item应用
]

item应用URL(item/urls.py)

定义带event_id参数的新增Item路由,同时支持GET(打开表单)和POST(提交表单)请求:

from django.urls import path
from . import views

urlpatterns = [
    # 函数视图版本
    path('new/<int:event_id>/', views.item_new, name='item_new'),
    # 类视图版本(若使用CreateView)
    # path('new/<int:event_id>/', views.ItemCreateView.as_view(), name='item_new'),
]

2. 修正表单模板的action属性

在item/templates/item/form.html中,必须用Django的{% url %}标签明确生成带event_id的提交路径,避免参数丢失:

<form method="post" action="{% url 'item_new' event_id=event.id %}">
    {% csrf_token %}
    <!-- 你的表单字段,例如:{{ form.as_p }} -->
    <button type="submit">保存Item</button>
</form>

注意:模板中需存在event变量,需由视图渲染时传递到模板上下文。

3. 修正视图逻辑(处理event_id并传递变量)

函数视图版本(item/views.py)

确保视图接收event_id参数,获取对应Event对象,提交表单时关联Item到该Event,并将Event传递给模板:

from django.shortcuts import render, redirect
from .models import Item
from .forms import ItemForm
from event.models import Event
from django.http import Http404

def item_new(request, event_id):
    try:
        event = Event.objects.get(id=event_id)
    except Event.DoesNotExist:
        raise Http404("Event不存在")
    
    if request.method == 'POST':
        form = ItemForm(request.POST)
        if form.is_valid():
            # 先暂不保存到数据库,关联Event后再提交
            item = form.save(commit=False)
            item.event = event
            item.save()
            # 提交成功后跳转到对应Event的items_dashboard页面
            return redirect('items_dashboard_index', event_id=event_id)
    else:
        form = ItemForm()
    
    # 将event传递给模板,用于生成表单action的URL
    return render(request, 'item/form.html', {'form': form, 'event': event})

类视图版本(ItemCreateView)

若使用Django通用类视图,需重写方法处理event_id参数:

from django.views.generic.edit import CreateView
from .models import Item
from .forms import ItemForm
from event.models import Event
from django.urls import reverse_lazy
from django.http import Http404

class ItemCreateView(CreateView):
    model = Item
    form_class = ItemForm
    template_name = 'item/form.html'

    def get_context_data(self, **kwargs):
        # 将Event对象传递给模板
        context = super().get_context_data(**kwargs)
        try:
            context['event'] = Event.objects.get(id=self.kwargs['event_id'])
        except Event.DoesNotExist:
            raise Http404("Event不存在")
        return context

    def form_valid(self, form):
        # 关联Item到对应的Event
        item = form.save(commit=False)
        item.event = Event.objects.get(id=self.kwargs['event_id'])
        item.save()
        return super().form_valid(form)

    def get_success_url(self):
        # 提交成功后跳转的目标URL
        return reverse_lazy('items_dashboard_index', kwargs={'event_id': self.kwargs['event_id']})

4. 检查初始添加链接的正确性

在/event/<event_id>/items_dashboard/index.html中,打开表单的链接需正确生成带event_id的URL:

<a href="{% url 'item_new' event_id=event.id %}">添加新Item</a>

确保模板中存在event变量(由items_dashboard的视图传递)。

常见错误排查点

  • 表单action未指定或路径错误,导致POST请求URL丢失event_id
  • URL路由未定义带event_id的路径,无法匹配提交请求
  • 视图未正确接收event_id参数,或未将Event对象传递给模板
  • 表单保存时未将Item关联到对应的Event对象

内容的提问来源于stack exchange,提问作者Nht_e0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:32:12