2013-12-15 2 views
0

clean() 메서드는 forms.py에 정의 된 유효성 검사 규칙에 따라 양식을 정리합니다. 사용자 이름에 "@"사용자 지정 clean() 메서드는 "NoneType is iterable"오류를 발생시킵니다.

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 ... 

그리고 새로운 사용자가 사용하지 않도록 만들기 위해 문자를 (하나의 이메일을 하나 개의 계정 만 등록) I :

사용자 등록을 위해 나는 다음과 같은 양식을 만들었습니다 이 사용 내 RegisterFormclean 방법 :

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 

하지만 그것은 나에게 clean 방법에 표시된 오류 줄에 argument of type 'NoneType' is not iterable 오류를 제공 빈 양식을 제출할 때 문제가 있습니다.

Django는 먼저 양식이 정상인지 확인한 다음 오류 줄을 확인해야합니까? 또는 어떻게 해결할 수 있습니까? 내 실수는 뭐니?

답변

3

itsjeyd가 말한 것처럼 사용자 이름이 비어 있기 때문에 오류가 발생합니다. 그러나 더 좋은 해결책은 define a clean_username method입니다. 필드가 비어 있지 않은 경우에만 호출되며 단일 필드의 유효성을 검사하는 기본 방법입니다. clean은 서로 종속 된 필드의 유효성을 검사하는 데 가장 적합합니다. clean_username에서 오류 dict에 값을 삽입하는 대신 forms.ValidationError을 발생시킵니다.

0

사용자 이름 필드를 비워두면 cleaned_data.get('username')None을 반환합니다. "@"in user_username인지 여부를 검사 할 때, user_username 인 문자를 반복하도록 Python에 알리고 있습니다. 즉, None이므로 반복 할 수 없습니다.

으로 변경하여 NoneType is not iterable 오류를 방지 할 수 있습니다.

관련 문제