如何在 Django 中正确定义 url(错误页面未找到(404))

问题描述 投票:0回答:1

(我尝试了类似问题中提供的解决方案,但没有用)。

我正在学习 Django,并构建以下项目:

我的项目是

es
。我有 3 个应用程序,分别为
event
items_dashboard
item
。每个
event
有一个
items_dashboard
,以及零个或多个
item

当用户处于

/event/<event_id>/items_dashboard/index.html
时,有一个链接可将新项目添加到事件 。这将打开一个表格
/item/new/<event_id>
。当我填写并提交此表单时,出现以下错误:

Page not found (404)
Request Method: POST
Request URL:    http://127.0.0.1:8000/item/new/
Using the URLconf defined in event_site.urls, Django tried these URL patterns, in this order:

[name='index']
event/
item/ new/<int:event_id> [name='new']
item/ <int:pk>/ [name='detail']
item/ <int:pk>/delete [name='delete_item']
The current path, item/new/, didn’t match any of these.

问题: 如何正确定义此场景的 url?

====================================================== =============== 支撑材料:

我的相关

urls.py
文件如下:
es/urls.py

urlpatterns = [
    path('', include('core.urls')),
    path('admin/', admin.site.urls),
    path('event/', include('event.urls', namespace="event")),
    path('item/', include('item.urls', namespace="item")),
    # path('', index, name='index')
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

item/urls.py

app_name = 'item'

urlpatterns = [
    # path('new/', views.new, name='new'),
    path('new/<int:event_id>', views.new, name='new'),
    path('<int:pk>/', views.detail, name='detail'),
]

event/urls.py

app_name = 'event'

urlpatterns = [
    path('new/', views.new, name='new'),
    path('<int:pk>/', views.detail, name='detail'),
    path('<int:event_id>/items_dashboard/', include('items_dashboard.urls', namespace='items_dashboard')),
    path('<int:event_id>/item/', include('item.urls', namespace='item'))
]

我的

item/views.py
有这个函数(从活动中我可以看到,当我提交表单时,调用了
new()
函数,并提供了正确的
event_id
):

@login_required()
def new(request, event_id):
    event = get_object_or_404(Event, pk=event_id)
    if request.method == "POST":
        form = NewItemForm(request.POST, request.FILES)
        if form.is_valid():
            item = form.save(commit=False)
            item.event = event
            item.creator = request.user
            item.save()
            return redirect('item:detail', pk=item.id)
    else:
        form = NewItemForm()
    
    return render(request, 'item/form.html', {
        'form': form,
        'title': 'Add new item'
    })

最后,

item/templates/item/form.html

{% extends 'core/base.html' %}

{% block title %}{{ title }}{% endblock %}

{% block content %}
<h1 class="mb-6 text-3xl">{{ title }}</h1>
<form method="post" action="." enctype="multipart/form-data">
    {% csrf_token %}

    <div class="space-y-4">
        {{ form.as_p }}
    </div>

    {% if form.errors or form.non_field_errors %}
        <div class="mb-3 p-6 bg-red-100 rounded-xl">
            {% for field in form %}
                {{ field.errors }}
            {% endfor %}

            {{ form.non_field_errors }}
        </div>
    {% endif %}

    <button class="mt-6 py-4 px-8 text-lg bg-teal-500 hover:bg-teal-700 rounded-xl text-white">Create Item</button>
</form>
{% endblock %}

python django
1个回答
0
投票

问题出在 html 表单操作上。

<form method="post" action="." enctype="multipart/form-data">

此行将表单提交到根位置

要解决此问题,只需删除操作属性即可。默认情况下,表单将请求提交到浏览器中显示的相同网址。

像这样修改该行。

<form method="post" enctype="multipart/form-data">
© www.soinside.com 2019 - 2024. All rights reserved.