Короткий ответ
Ошибка в том, что ветка для POST не возвращает HttpResponse/redirect — функция в этом случае возвращает None, из-за чего Django выбросит ValueError: The view didn't return an HttpResponse object.
Как это работает подробнее
Каждая Django view-функция обязана вернуть объект, совместимый с HttpResponse (или JsonResponse, redirect() и т. п.), по каждому пути выполнения. Если код выполнится и дойдёт до конца функции без return, Python вернёт None, а Django интерпретирует это как ошибку конфигурации view.
Пример кода
example.py
# Ошибка: в ветке POST нет return после form.save()
def create_article(request):
if request.method == "POST":
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
# <-- пропущен return redirect("article_list")
else:
form = ArticleForm()
return render(request, "create.html", {"form": form})
# Проверка: валидный POST приведёт к ValueError с сообщением
# "create_article didn't return an HttpResponse object. It returned None instead."Что использовать на практике
- Практика. Для отладки таких ошибок полезно убедиться, что каждая ветка
if/elif/elseзавершается явнымreturn; линтеры и статический анализ (например, с аннотацией-> HttpResponse) помогают заметить пропущенный return до запуска.
Подводные камни
- Риск. Забывают
returnпосле обработки формы/сохранения объекта, особенно при добавлении новой веткиelifк существующему коду; путают side-effect (например,form.save()) с завершением функции.