2012-03-13 10 views
0

カスタムインラインフォームセットに問題があります。 delete checkedの行をスキップする検証が必要です。検証でDELETE行をスキップ

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 

同時に、少なくとも1つの行を強制的に実行する必要はありません。 TravelsRelationsForm' object has no attribute 'forms'のため、これは機能しません。

ありがとうございます!

答えて

0

このエラーが発生するのは正常です。モデルフォームにインラインフォームセットロジックがあります。

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() 

そして、このようなフォームセットの検証:

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

は、ビュー内で直接行うことができるあなたはクリーンfull_clean()メソッドを持つ()メソッドをあなたのModelFormを置き換えることができます。

+0

何らかの理由でこれがうまくいきません...まだ空の行がすべて欠落としてマークされています(チェックが削除されています) – Mission

+0

実際、問題はDjangoが必須ではなくてもすべてのフィールドを返すことでした。空にすることができますが、それらはtravelformset.errorsに存在します... – Mission

関連する問題