django - /accounts/register 处的 ValueError。无法创建用户,因为数据未验证。(django模型形式)
问题描述
我不明白为什么会发生这个错误。所以,这是我非常简单的用户模型:
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
pass
我的模型表格:
class RegistrationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Cofirm Password', widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username', 'email')
def clean_password(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
return False
return True
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
我认为我在哪里调用 form.save() 方法:
class Register(View):
template = 'application/register.html'
success_url = 'application:index'
def get(self, request):
ctx = {
'form': RegistrationForm(),
}
return render(request, self.template, ctx)
def post(self, request):
form = RegistrationForm(request.POST)
instance = form.save(commit=False)
if not form.is_valid():
ctx = {
'form': RegistrationForm(),
}
return render(request, self.template, ctx)
instance.save()
login(request, instance)
return redirect(self.success_url)
有人可以帮我理解我在这里做错了什么吗?
谢谢
解决方案
你不能跑instance = form.save(commit=False)
之前.is_valid()
。
首先验证表单,然后创建User
实例。如果表单未通过验证,我已经为您创建了一条返回错误的路线。
def post(self, request):
form = RegistrationForm(request.POST)
if form.is_valid():
instance = form.save()
login(request, instance)
return redirect(self.success_url)
ctx = {
'form': form,
}
return render(request, self.template, ctx)
但请确保在模板中呈现错误。这方面的一个例子是:
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endif %}
推荐阅读
- javascript - JS:日期操作
- operating-system - 如何在微型 RTOS 中实现调度程序,该调度程序能够在任务超时时中断任务
- file - Symfony 3 上传文件 - FileNotFoundException
- windows - 如何在 VS 代码任务中获取时间戳?
- sql - MSSQL - 如果第一次返回 0,则运行第二次选择
- sql - 在同一个表中链接行是一种不好的模式吗?
- node.js - 我可以在没有 docker 的 Windows Server 上运行 Puppeteer.js 刮板吗?
- java - 更新到 Android Studio 3.2.1 后无法解析模块依赖
- javascript - 如何在 CKEditor 5 的自定义元素中插入带有标题的图像?
- regex - 在 Python 中使用正则表达式检测凌乱文本中的段落边界