首页 > 解决方案 > /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)

有人可以帮我理解我在这里做错了什么吗?

谢谢

标签: djangodjango-modelsdjango-formsmodelform

解决方案


你不能跑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 %}

推荐阅读