据我所知,clean()
方法根据forms.py
中定义的验证规则清除表单。
为了注册用户,我创建了一个这样的表单:
from django import forms
from django.contrib.auth.models import User
class RegistationForm(forms.Form):
# More fields ...
username = forms.CharField(
max_length=30, min_length=3, widget=forms.TextInput(
attrs={'placeholder': 'Username',
'title': 'You will use this for log in.'}))
# More fields ...
为了确保新用户不在用户名中使用“@”字符(并且仅使用一封电子邮件注册一个帐户),我在RegisterForm
的{{1}}方法中使用了此字段:< / p>
clean
但问题是,当我提交一个空表单时,它会在def clean(self):
cleaned_data = super(RegistationForm, self).clean()
user_email = cleaned_data.get("email")
user_username = cleaned_data.get("username")
if "@" in user_username: # Line causing error
msg = u"Usernames may contain alphanumeric, _, +, . and - characters."
self._errors["username"] = self.error_class([msg]
del cleaned_data["username"]
# More validation logic ...
return cleaned_data
方法中显示错误行中出现argument of type 'NoneType' is not iterable
错误。
不应该Django首先检查表单是否正常,然后才检查错误行? 或者我该如何解决?我的错是什么?
答案 0 :(得分:3)
正如itsjeyd所说,错误是因为用户名是空的。但是,更好的解决方案是define a clean_username
method。仅当字段不为空时才会调用此方法,并且这是验证单个字段的首选方法 - clean
最适合验证彼此依赖的字段。在clean_username
中,您引发forms.ValidationError
而不是在错误字典上插入值。
答案 1 :(得分:0)
如果您将用户名字段留空,cleaned_data.get('username')
将返回None
。在检查"@"
是否为in user_username
时,您告诉Python迭代user_username
中的字符 - None
,因此无法迭代。
您可以将支票更改为if user_username and "@" in user_username
以防范NoneType is not iterable
错误。