Страница не найдена (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')