首页 > 解决方案 > 为什么我有错误 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')
]

我的观点.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'})

标签: pythondjango

解决方案


如果您发出有效的POST 请求,并且在创建用户时没有 rasing 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'})

推荐阅读