Почему Django поднял ValueError? - PullRequest
0 голосов
/ 25 октября 2018

Это мой файл view.py в папке моего проекта.Когда я добавляю значение в список дел, возникает эта ошибка?

Представление my_day.views.index не возвращало объект HttpResponse.Вместо этого он вернул None.

views.py

from django.shortcuts import render, redirect
from .models import List
from .form import ListForm
from django.contrib import messages


# Create your views here.
def index(request):
    if request.method == "POST":
        form = ListForm(request.POST or None)

        if form.is_valid():
            form.save()
            all_items = List.objects.all
            messages.success(request, ('Task Added'))
            return render(request, 'index.html', {'all_items': all_items})

     else:

        all_items = List.objects.all
        return render(request, 'index.html', {'all_items': all_items})

1 Ответ

0 голосов
/ 25 октября 2018

По вашему мнению, у вас есть 3 возможных результата на основе условий if, но только 2 из них возвращают объект HttpResonse.В частности, if form.is_valid() возвращает объект HttpResponse только в случае выполнения этого условия.Если этого не произойдет, он вернет None (в основном ничего), потому что нет условия else или другого запасного варианта.

Вам необходимо добавить условие else в if form.is_valid().Более того, вы должны реализовать другой подход, чем обслуживание контента по запросу POST.Как прокомментировал WillemVanOnsem , ознакомьтесь с шаблоном Post / Redirect / Get .Я заменил return render(...) экземпляры, где это необходимо для достижения этой цели, но потребуется некоторая настройка для работы, например, заменить имя представления (должно быть определено в вашем файле urls.py).

def index(request):
    if request.method == "POST":
        form = ListForm(request.POST or None)

        if form.is_valid():
            form.save()
            all_items = List.objects.all
            messages.success(request, ('Task Added'))
            # Replaced the render(...) with a redirect instead.
            # Replace "index" with the name of the view (if not index)
            return HttpResponseRedirect(reverse("index"))
        else:
            # Added fallback if the form.is_valid() didn't pass
            messages.failure(request, ('Failed when saving task'))
            return render(request, 'index.html', {'all_items': all_items})

    else:
        all_items = List.objects.all
        return render(request, 'index.html', {'all_items': all_items})
...