(我尝试了类似问题中提供的解决方案,但没有用)。
我正在学习 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 %}
问题出在 html 表单操作上。
<form method="post" action="." enctype="multipart/form-data">
此行将表单提交到根位置
要解决此问题,只需删除操作属性即可。默认情况下,表单将请求提交到浏览器中显示的相同网址。
像这样修改该行。
<form method="post" enctype="multipart/form-data">