Невозможно заставить is_valid() вернуться к шаблону с привязанной формой

В документах Django говорится

Мы вызываем метод формы is_valid(); если не True, возвращаемся к шаблону с формой. На этот раз форма больше не является пустой (несвязанной), поэтому HTML-форма будет заполнена ранее отправленными данными, где их можно будет отредактировать и исправить по мере необходимости.

Я пытаюсь заставить это поведение работать.

В представлениях.py:

def test(request):
    if request.method == 'POST':
        form = TestForm(request.POST)

        if form.is_valid():
            return redirect('auctions/test.html')

    else:
        form = TestForm()
        return render(request, 'auctions/test.html', {'form': form})

В формах.py:

class TestForm(forms.Form):
    testnumber = forms.DecimalField(max_digits=1)

В test.html:

<form action="{% url 'auctions:test' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Теперь, когда я отправляю форму с числом, состоящим более чем из 1 цифры, is_valid() оценивается как False. Когда это происходит, в документах говорится, что шаблон должен отображаться с привязанной формой и ошибкой. Вместо этого ничего не происходит, и я получаю ValueError: The view auctions.views.test didn't return an HttpResponse object. It returned None instead.


person Ryan Eom    schedule 07.09.2020    source источник
comment
Является ли return render(request, 'auctions/test.html', {'form': form}) вкладкой в ​​последней строке кода views.py   -  person AyanSh    schedule 07.09.2020
comment
@AyanSh Нет. Ага. Вот оно. Если вы хотите опубликовать ответ, я могу принять. Не могу поверить, что я так долго боролся с этим.   -  person Ryan Eom    schedule 07.09.2020
comment
Хорошо, я опубликую ответ np   -  person AyanSh    schedule 07.09.2020


Ответы (1)


Ваша ошибка заключается в том, что последняя строка вашего файла views.py имеет отступ.

Вместо:

def test(request):
    if request.method == 'POST':
        form = TestForm(request.POST)

        if form.is_valid():
            return redirect('auctions/test.html')

    else:
        form = TestForm()
        return render(request, 'auctions/test.html', {'form': form})

Так должно быть:

def test(request):
    if request.method == 'POST':
        form = TestForm(request.POST)

        if form.is_valid():
            return redirect('auctions/test.html')

    else:
        form = TestForm()
    return render(request, 'auctions/test.html', {'form': form})
person AyanSh    schedule 07.09.2020