9

現在、興味深い問題を解決しようとしています。

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

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

また、そのモデルに基づいた ModelForm もあり、これにはimageフィールドが含まれており、いくつかのカスタム検証があります。

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

問題は、ドキュメントごとに、is_valid()フォームの検証に加えてモデルの検証をトリガーすることを呼び出すことです。そのModelFormため、ユーザーが画像なしでモデル フォームを送信すると、カスタム フォームの検証コードは、何もしないのではなく、デフォルトのモデル画像を検証しようとします。それが想定されているように。

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

4

1 に答える 1

17

非常に簡単な方法でそれを解決しました。他の人に役立つ場合に備えて、ここに回答を追加します。

Djangoのドキュメントには次のように記載されています

...モデルオブジェクトにバインドされたモデルフォームインスタンスには、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

問題が解決しました!

于 2012-10-09T19:38:28.323 に答える