如何在 Django admin class 中检查图像宽度和高度?

How to check image width & height in Django admin class?

我已经注册了一个像下面这样的 class 有一个管理面板来上传图片:

android_dashboard.register(Banner, BannerAdmin)

横幅模型如下:

class Banner(models.Model):    
    image = ImageField(
        _('Image'), upload_to=upload_path, blank=True, null=True,
        content_types=['image/jpg', 'image/jpeg', 'image/png'],
        max_size=1 * 1024 * 1024, extensions=['jpg', 'jpeg', 'png']
    )    
    type_of_banner = models.CharField(_('Type of Banner'), max_length=3, default='web')

    class Meta:
        verbose_name = _('Banner')
        verbose_name_plural = _('Banners')

    def __str__(self):
        return '%s' % str(self.id)

模型管理员如下所示:

class BannerAdmin(admin.ModelAdmin):
    model = Banner
    fields = ('image', 'type_of_banner')
    list_display = ('image', 'type_of_banner')

现在,当我登录到管理部分时,我可以直接将图像上传到服务器。但我想在上传图片之前检查比率。

问题是上传图片前我应该如何以及何时检查图片的宽度和高度?

您可以创建自定义表单并使用干净的方法来检查图像的宽度和高度

class BannerAdmin(admin.ModelAdmin):
    form = BannerForm
    model = Banner
    fields = ('image', 'type_of_banner')
    list_display = ('image', 'type_of_banner')


class BannerForm(forms.ModelForm):
    def clean_image(self):
        image = self.cleaned_data['image']
        #image.height, image.width
        return image

如果你想在之前验证维度,你将它上传到你的django后端我认为你必须使用自定义小部件javascript。

类似这样的方法可行:

class CustomImageInput(widgets.FileInput):

    def __init__(self, max_width, max_height, attrs=None):
        super(CustomImageInput, self).__init__(attrs)
        self.attrs.update({
            'data-max-width': max_width,
            'data-max-height': max_height,
            'class': 'custom-image-widget'
        })

    class Media:
        js = ('custom_image_widget.js',)

custom_image_widget.js 会包含类似这样的内容:

window.URL = window.URL || window.webkitURL;

$(document).ready(function() {
    $(".custom-image-widget").change(function(e) {
        var data = $(this).data(),
            maxWidth = data.maxWidth,
            maxHeight = data.maxHeight;

        if ((file = this.files[0])) {
            var img = new Image();
            img.src = window.URL.createObjectURL( file );

            img.onload = function() {
                var width = img.naturalWidth,
                    height = img.naturalHeight;

                window.URL.revokeObjectURL( img.src );

                if( width > maxWidth || height > maxHeight ) {
                    // Show error message
                    $(this).val("");
                }
            };
        }
    }
    $(".custom-image-widget").each(function() {
        var data = $(this).data(),
            maxWidth = data.maxWidth,
            maxHeight = data.maxHeight;

    });
});

然后您需要将此小部件附加到您的管理模型 ImageField:

class BannerAdminForm(forms.ModelForm):
    class Meta:
        model = Banner
        widgets = {
          'image': CustomImageInput(max_height=400, max_width=300),
        }
        fields = '__all__'

class BannerAdmin(admin.ModelAdmin):
    form = BannerAdminForm

我将 javascript 基于 this answer