Как правильно определить 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 является первичным ключом, то он будет автогенерироваться?

Вернуться на верх