2012-10-29 92 views
0

我有一個簡單的表格,一種觀點認爲,正在做的事情爲基礎的:古怪值{ '名':{...}}

from annoying.decorators import ajax_request 

@require_POST 
@login_required 
@ajax_request 
def my_view(request): 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     form.save(request.user) 
     return {"ok": True} 
    return {"ok": False, "errors": form.errors} 

forms.py:

class MyForm(forms.Form): 
    name = forms.CharField(max_length=250) 

    def clean_name(self): 
     cleaned_data = self.cleaned_data 

     name = cleaned_data.get('name', '') 
     if MyModel.objects.filter(name__iexact=name).exists(): 
      raise forms.ValidationError(_(u"This already exists.")) 
     return cleaned_data 

    def save(self, user): 
     obj, created = MyModel.objects.get_or_create(name=self.cleaned_data["name"], user=user) 
     return obj 

但我在獲取form.save方法中的self.cleaned_data時遇到問題。 在MyForm.clean_name我的self.cleaned_data很酷。

但在form.save級別,self.cleaned_data = {'name':{...}} 與self.cleaned_data ['name']相同。等待它..但也self.cleaned_data ['name'] ['name'] ['name'] ['name'] ['name'] ... ['name'] ['name']

類型(self.cleaned_data),它的關鍵是dict

什麼可以使我的代碼行爲像這樣?

+0

很難分辨,而不必所有的代碼(例如'MyModel')。看起來像一個很好的遞歸字典雖然;-)。 'clean_data在'clean_name'中保存不錯;還在最後,就在你回來之前? – Evert

+1

順便說一句,你有沒有考慮使用ModelForm來代替。 save()'有點混亂,因爲這通常只適用於ModelForms。 (另外:在第二個代碼塊中固定縮進。) – Evert

回答

5

您的問題是clean_<fieldname>應該返回清潔值,而不是整個cleaned_data詞典:

def clean_name(self): 
    cleaned_data = self.cleaned_data 

    name = cleaned_data.get('name', '') 
    if MyModel.objects.filter(name__iexact=name).exists(): 
     raise forms.ValidationError(_(u"This already exists.")) 
    return name