2013-05-14 4 views
2

Ошибка Argument of type 'NoneType' is not iterable и не может понять, почему.Аргумент типа «NoneType» не повторяется при попытке обновить объект модели

Это происходит на линии if model_form.is_valid():

Views.py

def update_model(request, pricemodel_id): 
    """ Update a part given its id. """ 
    pricemod = Part.objects.get(id=pricemodel_id) 
    if request.method == "POST": 
     print "post request" 
     model_form = priceform(request.POST, request.FILES, instance=pricemod) 
     model_form.is_update = True 
     if request.user == pricemod.adder: 
      #from ipdb import set_trace; set_trace() 
      if model_form.is_valid(): 

Forms.py

class priceform(ModelForm): 
# price Form: form associated to the Part model 
    def __init__(self, *args, **kwargs): 
     super(priceform, self).__init__(*args,**kwargs) 
     self.is_update=False 
     choices = UniPart.objects.all().values('manufacturer').distinct() 
    def clean(self): 
     if self.cleaned_data and 'modelname' not in self.cleaned_data: 
      raise forms.ValidationError("Some error message") 
      if not self.is_update: 
       return self.cleaned_data 
      return self.cleaned_data 
    class Meta: 
     model = Part 

ответ

3

Похоже, это происходит потому, что неправильно отступов в вашем чистом методе. Ток он ничего не возвращает, то есть возвращает None, но должен вернуть self.cleaned_data. Весь ваш код метода clean находится под if, что приведет к возникновению исключения. И если этот if не согласован, возвращается None.

Попробуйте это:

class priceform(ModelForm): 
    # ... 
    def clean(self): 
     if self.cleaned_data and 'modelname' not in self.cleaned_data: 
      raise forms.ValidationError("Some error message") 
     if not self.is_update: 
      return self.cleaned_data 
     return self.cleaned_data 

    # ... 
+0

Благодаря могли бы вы действительно кратко объяснить, что чистый метод делает и как делает is_valid метод знать, чтобы проверить это? – user1328021

+0

'is_valid' вызывает цепочку методов, которая выполняет проверку. Последняя часть: 'clean_ ' методы вызываются для каждого поля, а затем 'clean'. 'clean_ ' метод проверяет данные исключительно для '' поля. В 'clean',' self.cleaned_data' содержит данные, уже проверенные соответствующими методами 'clean_ '. Таким образом, здесь могут быть проверены некоторые общие правила и правила, связанные с двумя или более связанными полями, когда для ex. одно поле должно учитывать другое поле. Вот [подробный документ] (https://docs.djangoproject.com/en/dev/ref/forms/validation/) – stalk

Смежные вопросы