5

画像のアップロードフィールドがあるDjangoモデルがあり、保存する前に画像フィールドを検証して画像サイズを確認し、ユーザーが修正するためのエレガントなエラーメッセージを返します。

次のコードを使用しようとしましたが、機能しませんでした

admin.py

class BonanzaAdmin(TranslatableAdmin):
    list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']

    def clean_image(self):

        image = self.cleaned_data.get('image')
        if not image:
            raise forms.ValidationError("No image!")
        else:
            w, h = get_image_dimensions(image)
            if w != 1170:
                raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
            if h != 500:
                raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
        return image 


    def save_model(self, request, obj, form, change):
        if not change:
            obj.created_by = request.user
        obj.save()

clean_image()全体が呼び出されていません。また、名前をimage_clean()に逆にしようとしましたが、機能しませんでした。とにかく、検証をsave_modelに移動しようとしました

class BonanzaAdmin(TranslatableAdmin):
    list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']


    def save_model(self, request, obj, form, change):
        image = obj.image
        if not image:
            raise forms.ValidationError("No image!")
        else:
            w, h = get_image_dimensions(image)
            if w != 1170:
                raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
            if h != 500:
                raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
        if not change:
            obj.created_by = request.user
        obj.save()

これで、2番目のコードは正常に機能し、検証プロセスが実行されますが、単純なエラーメッセージは表示されません。代わりに、例外をスローします!ユーザーが修正して再試行できるように、エラーを表示させるにはどうすればよいですか?

PSは翻訳にdjango1.4とdjango-hvadを使用しているため、TranslatableAdminから継承しています

よろしく

4

2 に答える 2

11

demalexxが言ったように、モデルを検証するには追加のフォームを使用する必要があります。

class Bonanza(models.Model):
    user_profile = models.CharField(max_length = 128)
    publish_date = models.DateField()

管理フォームで検証を使用します。

class BonanzaAdminForm(forms.ModelForm):
    class Meta:
        model = Bonanza
    def clean(self):
        # Validation goes here :)
        raise forms.ValidationError("TEST EXCEPTION!")

そして、単純な自動生成された管理者:

class BonanzaAdmin(admin.ModelAdmin):
    form = BonanzaAdminForm

admin.site.register(Bonanza, BonanzaAdmin)
于 2012-09-23T12:14:27.987 に答える
1

継承ModelAdminし、検証メソッドがありません。代わりに、属性をオーバーライドformしてカスタム フォームを提供し、そのフォームに検証メソッドを追加する必要があります。管理者にカスタム検証に関するドキュメントがあります: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#adding-custom-validation-to-the-admin

于 2012-09-23T10:35:33.033 に答える