如何在 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
我已经注册了一个像下面这样的 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