django - 如何解决 'ValidationError'对象没有属性 'strip'问题?

标签 django validation django-forms

我想添加或提出验证注册表单,但收到此错误:'ValidationError'对象没有属性'strip'如何跳过它?

我遇到了这些问题,如果您能在解决这个问题后告诉我验证注册表单的正确方法,我将不胜感激。预先感谢您

class SignUp(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super(SignUp, self).__init__(*args, **kwargs)

        self.error_messages = {
            'username_match': 'username is already exist',
            'email_match': 'Email is already exist',
            'password_mismatch': 'these two password isn\'t match try again'
        }
    email = forms.EmailField(required=True)
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    # password1 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))
    # password2 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Confirm Password'}))

    class Meta:
        model = User
        fields = ['username',
                  'first_name',
                  'last_name',
                  'password1',
                  'password2',
                  'email']

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            return forms.ValidationError(
                self.error_messages['email_match'],
            )
        return email

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            return forms.ValidationError(
                self.error_messages['username_match'],
            )
        return username

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            return forms.ValidationError(
                self.error_messages['password_mismatch'],
            )
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

View .py

def register(request):
    form = SignUp(None)
    if request.method == 'POST':
        form = SignUp(request.POST)
        if form.is_valid():
            form.save()
            return redirect('accounts:login')
        return form.errors
    return render(request, 'accounts/register.html', {'form': form})

编辑新问题:

Traceback (most recent call last):
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al3/website/accounts/views.py", line 73, in register
    return render(request, 'accounts/register.html', {'form': form})
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/template/base.py", line 168, in render
    with context.bind_template(self):
  File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/media/medo/BE4C6BE74C6B98C3/Cources/Django/all git/Django projects/Es2al/Es2al2/website/venv/lib/python3.8/site-packages/django/template/context.py", line 244, in bind_template
    updates.update(processor(self.request))

Exception Type: ValueError at /accounts/register/
Exception Value: dictionary update sequence element #0 has length 207; 2 is required

url.py

urlpatterns = [
    path('register/', views.register, name='register'),
]

最佳答案

您不应该返回 ValidationError,而是引发它。通过返回它,表单假定用户名等的结果是ValidationError:

def clean_email(self):
    email = self.cleaned_data.get('email')
    if User.objects.filter(email=email).exists():
        <b>raise</b> forms.ValidationError(  # ← raise instead of <s>return</s>
            self.error_messages['email_match'],
        )
    return email

这一原则应该应用于所有clean_…方法。

在您看来,您还可以返回form.errors,或者至少不是直接返回,您可以打印 form.errors,并将它们传递给上下文,但 View 应该返回一个 HttpResponse 对象:

def register(request):
    form = SignUp()
    if request.method == 'POST':
        form = SignUp(request.POST)
        if form.is_valid():
            form.save()
            return redirect('accounts:login')
        <s># return form.errors</s>
    return render(request, 'accounts/register.html', {'form': form})

关于django - 如何解决 'ValidationError'对象没有属性 'strip'问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64671476/

相关文章:

javascript - 修复 IE 占位符的 Javascript 错误

python - save() 方法不会将表单数据保存到数据库(Django ModelForm)

DJANGO + Google App Engine,入门教程

jquery - 如果使用 jQuery 选择复选框,则有条件地将输入字段的属性设置为必需

zend-framework - Zend 框架 : Set a validator for starting letter as Capital

django - 如何从表单构造函数动态更新Django Form Meta类字段?

python - 如何在 Django 中引用一组模型字段?

django - 序列化程序 - Django REST Framework - 序列化程序字段可能命名不正确,并且与 `str` 实例上的任何属性或键都不匹配

django - 如何防止 Django 管理员用户更改其他管理员用户的个人资料数据?

django - 在 docker 容器中使用 pgadmin 和 nginx