Страница не найдена (404) Метод запроса: POST URL запроса: http://127.0.0.1:8000/blog/edit_post/post

Я считаю, что настроил все правильно, но не могу понять, что вызывает сообщение об ошибке.

Что я пытаюсь сделать, так это применить представление, которое позволяет мне редактировать запись в блоге.

Сообщение об ошибке:

Using the URLconf defined in diyblog.urls, Django tried these URL patterns, in this order:

admin/
blog/ [name='index']
blog/ blogs/ [name='all-posts']
blog/ <int:post_id> [name='post-details']
blog/ new_post/ [name='new-post']
blog/ edit_post/<int:post_id> [name='edit-post']
summernote/
^media/(?P<path>.*)$
The current path, blog/edit_post/post, didn’t match any of these.

Вид:

def edit_post(request, post_id):
    post = Post.objects.get(id=post_id)

    edit_form = PostForm(instance=post)

    if request.method == 'POST':
        if edit_form.is_valid():
            mod_post = edit_form.save(commit=False)
            mod_post.save()
            return redirect(get_all_posts)

    context_dict = {
        'edit_form': edit_form
    }
    return render(request, 'blog/edit_post.html', context=context_dict)

Форма:

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title', 'body',)
        exclude = ['author', ]

        widgets = {
            'body': SummernoteWidget(),
        }

url patterns:

urlpatterns = [
    path('', views.index, name='index'),
    path('blogs/', views.get_all_posts, name='all-posts'),
    path('<int:post_id>', views.get_post_details, name='post-details'),
    path('new_post/', views.add_new_post, name='new-post'),
    path('edit_post/<int:post_id>', views.edit_post, name='edit-post')
]

Шаблон:

<h1>Edit Post</h1>
<form action="post" method='post'>
    {% csrf_token %}
    {{ edit_form.as_p }}
    <button name="submit">Save changes</button>
    <form>

Может ли кто-нибудь помочь мне выяснить, почему я получаю это сообщение об ошибке и почему это происходит?

Во-первых, атрибут action в теге формы не должен там находиться. Он указывает url, по которому будет сделан запрос формы, относительно текущего url документа. В данном случае он заменил последнюю часть url (целочисленный id редактируемого поста) на простой '/post', таким образом выдав 404, так как ваш сервер не ожидает запросов по этому пути.

(POST-запрос отправлялся на /blog/edit_post/post, тогда как если вы удалите атрибут action, он будет отправлен на тот же адрес, который вы видите в навигационной панели браузера, когда находитесь на этой странице)

Во-вторых, ваш обработчик edit_post полностью проигнорировал полезную нагрузку запроса, вместо этого он нашел сохраняемый пост и сохранил его снова. Соответствующая документация

Последнюю проблему с пустой формой при загрузке немного сложнее объяснить, если вы еще не знаете, что происходит. Оба запроса на отображение страницы и на сохранение изменений находятся под одним и тем же url и имеют один и тот же обработчик (edit_post). Соответственно, условное предложение проверяет, является ли текущий метод запроса GET (предполагаемый по умолчанию) или POST, и в зависимости от этого выполняет различные ветви.

'post' не целое число path('edit_post/<int:post_id>', views.edit_post, name='edit-post')

если вы хотите, чтобы URL был строкой, используйте slug: path('edit_post/<slug:post_id>', views.edit_post, name='edit-post')

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