首页 > 解决方案 > Django - 试图清理电子邮件字段正在抛出 ''dict' 对象没有属性 'strip'"

问题描述

在我的项目进行到一半时,我意识到我可以使用相同的电子邮件地址创建一个帐户。这肯定会在以后产生一些问题(恢复帐户等)。

所以我想出了通过搜索电子邮件来测试是否已经在数据库中注册的帐户来清理电子邮件字段的想法。

class UserRegistrationForm(forms.ModelForm):
    ...
    email = forms.CharField(label='Email', widget=forms.EmailInput(attrs={'class':'form-control form-control-sm'}))
    ...


class Meta:
    model = User
    fields = {'username', 'first_name', 'last_name', 'email'}


def clean_email(self):
    email = self.cleaned_data.get('email')
    if User.objects.filter(email=email).exists():
        raise forms.ValidationError("Email is already registered")
    return self.cleaned_data

这应该可以解决问题,但它正在抛出

'dict' object has no attribute 'strip'

我还确保在函数中设置清理后的电子邮件。

这是我的注册方法:

def register(request):
    if request.user.is_authenticated:
        return redirect('somewhere')
    else:
        if request.method == "POST":
            user_form = UserRegistrationForm(request.POST)
            if user_form.is_valid():
                # begin google reCaptcha validation
                recaptcha_response = request.POST.get('g-recaptcha-response')
                url = 'https://www.google.com/recaptcha/api/siteverify'
                values = {
                    'secret': GOOGLE_RECAPTCHA_SECRET_KEY,
                    'response': recaptcha_response
                }
                data = urllib.parse.urlencode(values).encode()
                req =  urllib.request.Request(url, data=data)
                response = urllib.request.urlopen(req)
                result = json.loads(response.read().decode()) # end of reCaptcha validation

                if result['success']:
                    # create a new user but avoid saving it yet
                    new_user = user_form.save(commit=False)
                    new_user.set_password(user_form.cleaned_data['password'])
new_user.set_email(user_form.cleaned_data['email'])
                    new_user.save()
                    # automatically create a profile of new user
                    Profile.objects.create(
                        user=new_user,
                        ... )
                    messages.success(request, 'Account created successfully')
                    return render(request, 'account/register_done.html', {'new_user':new_user})
                else:
                    messages.error(request, 'Invalid reCAPTCHA. Please try again.')
        else:
            user_form = UserRegistrationForm()
        return render(request, 'account/register.html', {'user_form': user_form})

这是回溯:

Request Method: POST
Request URL: http://127.0.0.1:8000/account/register/

Django Version: 2.1.7
Python Version: 3.7.0


Traceback:

File "C:\Users\\MyVenv\\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\\MyVenv\\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\\MyVenv\\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\\\\account\views.py" in register
  60.             if user_form.is_valid():

File "C:\Users\\MyVenv\\lib\site-packages\django\forms\forms.py" in is_valid
  185.         return self.is_bound and not self.errors

File "C:\Users\\MyVenv\\lib\site-packages\django\forms\forms.py" in errors
  180.             self.full_clean()

File "C:\Users\\MyVenv\\lib\site-packages\django\forms\forms.py" in full_clean
  383.         self._post_clean()

File "C:\Users\\MyVenv\\lib\site-packages\django\forms\models.py" in _post_clean
  403.             self.instance.full_clean(exclude=exclude, validate_unique=False)

File "C:\Users\\MyVenv\\lib\site-packages\django\db\models\base.py" in full_clean
  1137.             self.clean()

File "C:\Users\\MyVenv\\lib\site-packages\django\contrib\auth\models.py" in clean
  338.         self.email = self.__class__.objects.normalize_email(self.email)

File "C:\Users\\MyVenv\\lib\site-packages\django\contrib\auth\base_user.py" in normalize_email
  25.             email_name, domain_part = email.strip().rsplit('@', 1)

Exception Type: AttributeError at /account/register/
Exception Value: 'dict' object has no attribute 'strip'

你能解释一下发生了什么,以及如何解决这个问题吗?

标签: pythondjangodjango-modelsdjango-forms

解决方案


您的clean_email方法应该返回电子邮件值,而不是整个cleaned_data 字典。

def clean_email(self):
    ...
    return email

推荐阅读