python - 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'
你能解释一下发生了什么,以及如何解决这个问题吗?
解决方案
您的clean_email
方法应该返回电子邮件值,而不是整个cleaned_data 字典。
def clean_email(self):
...
return email
推荐阅读
- python-3.x - 标准化 PC 的 KMeans 聚类图
- selenium - Appium Parallel Test Execution 删除一个设备的驱动程序,显示会话已终止或未启动
- c# - FakeItEasy:根据表达式返回不同的对象
- python - 在将对象附加到列表时删除引号
- haskell - 如何检查一个 IO() 是否等价于另一个 IO()?
- python - 日志队列和多处理问题
- python - 我在 django 管理站点中看不到对象的标题。只看这个:modelName object (2)
- postgresql - 给定一个州的 OSM 数据,找到它的面积
- android - 如何在 VideoView 控件或 android 的 MediaPlayer 中播放编码 HLS 流,不想使用其他库
- javascript - 可以在没有 await 关键字的情况下调用异步函数吗?如果我们在没有等待的情况下调用会发生什么?