2012-03-13 73 views
0

我在自定義inlineformset中遇到問題。我想驗證跳過具有delete checked的行。在驗證中跳過刪除行

class TravelsRelationsForm(ModelForm): 
def __init__(self, *args, **kwargs): 
    super(TravelsRelationsForm, self).__init__(*args, **kwargs) 
    if kwargs.has_key('instance'): 
     instance = kwargs['instance'] 
    else: 
     try: 
      self.initial['title'] 
     except: 
      self.initial[DELETION_FIELD_NAME] = True 

# Force update of child 
def has_changed(self, *args, **kwargs): 
    return True 

def clean(self): 
    cleaned_data = self.cleaned_data 
    count = 0 
    for form in self.forms: 
     try: 
      if not form.cleaned_data['DELETE']: 
       count += 1 
     except AttributeError: 
      pass 
    if count < 1: 
     raise forms.ValidationError('You must have at least one title') 

    return cleaned_data 

同時我wan't執行至少一行。這不起作用,因爲TravelsRelationsForm' object has no attribute 'forms'

謝謝!

回答

0

您看到此錯誤是正常現象。你在模型中有內聯模式邏輯。你可以用full_clean()方法替換您的ModelForm乾淨()方法:

def full_clean(self): 
    if self.data.get('DELETE', False): 
     # skip validation for form that has DELETE 
     return 

    # go through the normal validation process otherwise 
    return super(TravelsRelationsForm, self).full_clean() 

而這樣一個formset驗證:

raise forms.ValidationError('You must have at least one title') 

可直接在視圖中進行。

+0

由於某種原因,這不起作用...我仍然得到所有標記爲缺失的空行(刪除選中) – Mission 2012-03-13 08:53:32

+0

其實問題是Django返回所有字段,即使它們不是必需的......他們可以是空的,但它們存在於travelformset.errors中... – Mission 2012-03-13 09:03:47