Custom clean()方法抛出“NoneType不可迭代”错误

时间:2013-12-15 11:08:27

标签: python django forms django-forms

据我所知,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首先检查表单是否正常,然后才检查错误行? 或者我该如何解决?我的错是什么?

2 个答案:

答案 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错误。