Почему у меня возникла ошибка todo.views.signupuser не возвращает объект HttpResponse
Я пишу сайт на django. И почему-то в результате получаю ошибку The view todo.views.signupuser didn't return an HttpResponse object. It returned None instead.
. Как я могу исправить эту ошибку?
Ниже я прикреплю свой код.
Мой html код:
signupupser.html
<h1>Sign Up</h1>
<h2>{{ error }}</h2>
<form method="POST">
{% csrf_token %}
{{form.as_p}}
<button type="submit">Sign Up</button>
</form>
Мой urls.py:
urls.py
from django.contrib import admin
from django.urls import path
from todo import views
urlpatterns = [
path('admin/', admin.site.urls),
path('signup/', views.signupuser, name='signupuser')
]
Мой views.py
views.py
from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.db import IntegrityError
def signupuser(request):
if request.method == 'GET':
return render(request, 'todo/signupuser.html', {'form': UserCreationForm()})
else:
if request.POST['password1'] == request.POST['password2']:
try:
user = User.objects.create_user(request.POST['username'], password=request.POST['password1'])
user.save()
except IntegrityError:
return render(request, 'todo/signupuser.html', {'form': UserCreationForm(), 'error': 'That Username has already been taken. Please choose a new username'})
else:
return render(request, 'todo/signupuser.html',
{'form': UserCreationForm(), 'error': 'Passwords did not match'})
В случае, если вы делаете valid POST запрос, и пользователь создается без выполнения IntegrityError
, то представление не возвращает никаких HttpResponse
.
В этом случае вам нужно вернуть и HTTP-ответ, вероятно, перенаправление на URL для реализации архитектурного шаблона Post/Redirect/Get [wiki]:
from django.shortcuts import redirect
def signupuser(request):
if request.method == 'GET':
return render(request, 'todo/signupuser.html', {'form': UserCreationForm()})
else:
if request.POST['password1'] == request.POST['password2']:
try:
user = User.objects.create_user(request.POST['username'], password=request.POST['password1'])
user.save()
except IntegrityError:
return render(request, 'todo/signupuser.html', {'form': UserCreationForm(), 'error': 'That Username has already been taken. Please choose a new username'})
# ↓ cover this case
return redirect('name-of-some-view')
else:
return render(request, 'todo/signupuser.html',
{'form': UserCreationForm(), 'error': 'Passwords did not match'})