Как правильно определить url в Django (ошибка Page not found (404))
(я пробовал решения, приведенные в аналогичных вопросах, но они не сработали).
Я изучаю Django и создаю следующий проект:
Мой проект es
. У меня есть 3 приложения, которые называются event
, items_dashboard
и item
. В каждом event
есть одно items_dashboard
и ноль или более <<<7>>
Когда пользователь находится в /event/<event_id>/items_dashboard/index.html
, есть ссылка для добавления нового элемента в событие <event_id>. При этом открывается форма /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">
Эта строка отправляет форму в корневое расположение
для решения этой проблемы просто удалите свойство action. по умолчанию форма отправляет запрос на тот же url, который отображается в браузере.
измените строку следующим образом.
<form method="post" enctype="multipart/form-data">
Я тоже новичок в Django. Но, как прокомментировала @Nesi, я не вижу, где вы передаете id, для которого хотите создать. Также для нового элемента зачем вам вручную назначать id, вы должны иметь возможность просто вставить его в базу данных, верно? А если id является первичным ключом, то он будет автогенерироваться?