2012-10-09 14 views
6

今興味深い問題を解決しようとしています。Django ModelForm Validation

私はimageフィールドを持つDjangoモデルを持っていますが、これは必須ではありませんが、新しいモデルインスタンスが作成されるとデフォルト値に設定されます。

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

私もimageフィールドを含むそのモデルに基づいてのModelFormを、持っている、それはいくつかのカスタム検証を持っています。

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      # validate image 
     return None 

問題がModelFormis_valid()を呼び出し、そのper the docsでは、検証を形成するために加えて、モデルの検証をトリガーし、ユーザは画像なしでモデルのフォームを送信するとき、私のカスタムフォーム検証コードは、デフォルトモデルを検証しようイメージではなく、単に何もしていないからです。

フォーム自体にimageフィールドの値がない限り、何もしないようにするにはどうすればよいですか?

+0

'blank = True'はデータベースレベルでの検証で、' null = True'はモデルレベルでの検証なので、 'null = True'を追加する必要があります。 – karthikr

+3

@karthikr:そうではありません。 'nullは純粋にデータベース関連ですが、空白は検証に関連しています。フィールドにblank = Trueが指定されている場合は、フォームの検証によって空の値が入力されます。フィールドに空白=偽がある場合、そのフィールドは必須です。 [もっと詳しい情報はこちら](https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikrそれをもう一度確認したいと思うかもしれません。ドキュメントから 'nullは純粋にデータベース関連ですが、空白は検証に関連しています.' https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

答えて

10

ちょっと簡単に解決しました。他の人に役立つ場合は、ここに回答を追加してください。

The Django docs state that

...モデルオブジェクトにバインドされたモデルのフォームインスタンスは、モデルのフォームメソッドにその特定のモデルインスタンスへのアクセスを提供しますself.instance属性が含まれます。

ModelFormに画像の値があるかどうかを確認するのではなく、画像の値が保存されたインスタンスから変更されたかどうかを確認するだけです。フォームの検証は次のようになります。

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if not self.instance.image == image: 
      # validate image 
     return None 

問題が解決しました。