【问题标题】:'User' object has no attribute 'ValidationError'“用户”对象没有属性“验证错误”
【发布时间】:2018-09-18 10:53:12
【问题描述】:

我正在尝试创建一个注册表单。一切正常,直到我尝试引发验证错误以防电子邮件已经存在。它说,'User' object has no attribute 'ValidationError'

这就是我所做的,

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            new_form = form.save(commit=False)
            mail = form.cleaned_data['email']
            if User.objects.filter(email=mail).exists():
                raise new_form.ValidationError('Looks like email already exists')
            else:
                new_form.save()
            username = request.POST.get('username')
            password = request.POST.get('password1')
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect(reverse('accounts:profile'))
    else:
        form = RegistrationForm()

我们如何解决这个问题?

【问题讨论】:

  • 你可以在views.py和forms.py中发布你的导入
  • @VipinMohan 先生,我将其导入为from django.core.exceptions import ValidationError。此外,如果我从 View 中删除此 ValidationError 行,一切都会开始正常工作!
  • 尝试导入 forms.ValidationError,而不是 core.exceptions.ValidationError

标签: python django django-forms


【解决方案1】:

验证表单错误时,应该从 django.forms 导入 validationError 而不是 django.core.exceptions

试试:

from django.forms import ValidationError

【讨论】:

  • 请粘贴完整代码。 Models.py、forms.py 和 views.py
【解决方案2】:

尝试将以下方法添加到您的表单中

from django import forms
from .models import User

class RegistrationForm(forms.Form):

   # ..............
   # ..............

   def clean(self):
      mail = form.cleaned_data['email']
      if User.objects.filter(email=mail).exists():
          raise forms.ValidationError('Looks like email already exists')
      return self.cleaned_data

更改views.py中的代码

if User.objects.filter(email=mail).exists():
            raise new_form.ValidationError('Looks like email already exists')
        else:
            new_form.save()

new_form.save()

【讨论】:

  • 先生,它再次引发了类似的错误,'RegistrationForm' object has no attribute 'ValidationError'
  • 先生,现在出现错误'User' object has no attribute 'ValidationError'
  • 我该怎么办?
【解决方案3】:

你应该像这样引发 ValidationError:

raise ValidationError('Looks like email already exists')

这里是完整的代码:

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
            if form.is_valid():
                new_form = form.save(commit=False)
                mail = form.cleaned_data['email']
            if User.objects.filter(email=mail).exists():
                raise ValidationError('Looks like email already exists')
            else:
                new_form.save()
            username = request.POST.get('username')
            password = request.POST.get('password1')
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect(reverse('accounts:profile'))
    else:
        form = RegistrationForm()

【讨论】:

    【解决方案4】:
    if User.objects.filter(email=mail).exists():
                raise new_form.ValidationError('Looks like email already exists')
    

    使用“forms”而不是“new_form”,结果应该是这样的

    if User.objects.filter(email=mail).exists():
                    raise forms.ValidationError('Looks like email already exists')
    

    【讨论】:

      【解决方案5】:

      我输入如下,它在 django-2.0.7 上工作:

      from django import forms
      from django.contrib.auth import login
      from django.contrib.auth.models import User
      from django.shortcuts import render, redirect
      
      
      class RegistrationForm(forms.ModelForm):
          def clean_email(self):
              email = self.cleaned_data['email']
              if self.Meta.model.objects.filter(email=email).exists():
                  raise forms.ValidationError('Looks like email already exists')
              return email
      
          class Meta:
              model = User
              fields = ('username', 'password', 'email')
      
      
      def register(request):
          if request.method == 'POST':
              form = RegistrationForm(request.POST)
              if form.is_valid():
                  user = form.save(commit=False)
                  user.set_password(user.password)
                  user.save()
                  login(request, user)
                  return redirect('accounts:profile')
          else:
              form = RegistrationForm()
          return render(request, 'register.html', {'form': form})
      

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 2018-02-02
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多