python - 为什么我有错误 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'})
解决方案
如果您发出有效的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'})
推荐阅读
- keras - 无效参数:indices[0,0] = -4 不在 [0, 40405)
- json - JSON Schema 验证具有不同属性名称的 JSON
- linux - 如何在 Linux BASH 上使用 split 在文件末尾添加编号后缀?
- ruby - Puppet 从延迟函数运行中获取值
- angular - MatDatePicker 显示在页面底部并且样式损坏
- python - 如何编写一个不带争论的函数 wrong_prime 并且应该返回 q = 2^p - 1 不是素数的第一个素数 p
- python - 改进算法输入验证
- regex - 如何从多个文本文件中提取某些特定单词
- javascript - 如何在 Typescript 中使用绝对路径?
- c++ - 如何将输入存储在动态数组中?