Ошибка Django с представлениями для отображения и сохранения формы

У меня есть виу для отображения и сохранения формы, как показано ниже:

@login_required(login_url='/login') # Check login
def addlisting(request):
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
        else:
            form = ProductForm()
        return render(request, 'listing/addlisting.html', {
            'form': form
        })

Но когда я загружаю html файл, я получаю эту ошибку

ValueError at /addlisting
The view listing.views.addlisting didn't return an HttpResponse object. It returned None instead.
Request Method: GET
Request URL:    http://127.0.0.1:8000/addlisting
Django Version: 3.2.3
Exception Type: ValueError
Exception Value:    
The view listing.views.addlisting didn't return an HttpResponse object. It returned None instead.
Exception Location: C:\Users\Daisy\OneDrive\Documents\Work\django\shecodes\bookapp\env\lib\site-packages\django\core\handlers\base.py, line 309, in check_response
Python Executable:  C:\Users\Daisy\OneDrive\Documents\Work\django\shecodes\bookapp\env\Scripts\python.exe
Python Version: 3.8.2
Python Path:    
['C:\\Users\\Daisy\\OneDrive\\Documents\\Work\\django\\shecodes\\bookapp\\bookapp',
 'C:\\Users\\Daisy\\OneDrive\\Documents\\Work\\django\\shecodes\\bookapp\\env\\Scripts\\python38.zip',
 'c:\\users\\daisy\\appdata\\local\\programs\\python\\python38\\DLLs',
 'c:\\users\\daisy\\appdata\\local\\programs\\python\\python38\\lib',
 'c:\\users\\daisy\\appdata\\local\\programs\\python\\python38',
 'C:\\Users\\Daisy\\OneDrive\\Documents\\Work\\django\\shecodes\\bookapp\\env',
 'C:\\Users\\Daisy\\OneDrive\\Documents\\Work\\django\\shecodes\\bookapp\\env\\lib\\site-packages']
Server time:    Sun, 30 Jan 2022 07:41:40 +0000

Пожалуйста, посмотрите. Заранее спасибо !!!!!!!!!!!!!!!!!!!!

Вы уверены, что используете метод POST?

Пожалуйста, попробуйте:

@login_required(login_url='/login') # Check login
def addlisting(request):
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
        else:
            form = ProductForm()
        return render(request, 'listing/addlisting.html', {'form': form})
    return redirect('home')

NOTE: Просто пытаюсь разобраться с ошибкой. пожалуйста, проверьте, что вы перенаправляетесь на home. если вы попадаете на home, значит, вы не используете метод POST.

Да, это ошибка: Метод запроса: GET

Вы используете GET. Пожалуйста, отправьте запрос методом POST.

Хорошая идея для использования:

from django.views.decorators.http import require_http_methods

@require_http_methods(["POST"])
def my_view(request):
    # I can assume now that only GET or POST requests make it this far
    # ...
    pass

почитайте больше об использовании декоратоса, чтобы разрешить нужный вам метод в вашей функции: https://docs.djangoproject.com/en/4.0/topics/http/decorators/

это может помочь вам:

from django.views.decorators.http import require_http_methods

@require_http_methods(["POST"])
@login_required(login_url='/login') # Check login
def addlisting(request):

    form = ProductForm(request.POST, request.FILES)

    if form.is_valid():
        form.save()
        return redirect('home')

    form = ProductForm()

    return render(request, 'listing/addlisting.html', {'form': form})

В вашем else нет части views.py, поэтому во время рендеринга страницы вызывается GET запрос и из-за этого он бросает didn't return an HttpResponse object. Поэтому добавьте else часть и render ваш ProductForm как

@login_required(login_url='/login') # Check login
def addlisting(request):
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
        else:
            form = ProductForm()
            return render(request, 'listing/addlisting.html', {'form': form})
    else: #<------------ add else part here which will `render` your form
        form = ProductForm()
        return render(request, 'listing/addlisting.html', {'form': form})
Вернуться на верх