【问题标题】:Django admin field validation to return error not raise exception in applicationDjango 管理字段验证返回错误而不是在应用程序中引发异常
【发布时间】:2012-09-23 08:59:40
【问题描述】:

我有一个 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()

现在第二段代码工作正常,它通过了验证过程,但没有显示简单的错误消息。相反,它会引发异常!我怎样才能让它显示错误,以便用户更正并重试?

P.S 我正在使用 django 1.4 和 django-hvad 进行翻译,这就是我从 TranslatableAdmin 继承的原因

问候

【问题讨论】:

    标签: django django-admin django-hvad django-nani


    【解决方案1】:

    正如 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)
    

    【讨论】:

    • 非常感谢,很好的例子帮助我找到了问题的根源:)
    【解决方案2】:

    您继承 ModelAdmin 并且它没有验证方法。相反,您应该覆盖 form 属性以提供自定义表单并向该表单添加验证方法。管理员中有关于自定义验证的文档:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#adding-custom-validation-to-the-admin

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多