从Admin接口删除ImageField时出现Django unicode错误



当使用Clear复选框删除上传的图像并在Django Admin界面中单击Save时,我得到以下结果:

/admin/foo/bar/1/处的类型错误

强制为Unicode:需要字符串或缓冲区,ImageFieldFile找到

异常值:强制为Unicode:需要字符串或缓冲区,找到ImageFieldFile异常位置:get_image_dimensions中的/home/ec2 user/ve/Project/lib/python2.6/site-packages/django/core/files/images.py,第47行

我知道这可能与返回的unicode类型有关,因此在相关的ImageField代码中从return image更改为return image.name,但这并没有解决问题。这是调试日志:

/home/user/ve/Project/lib/python2.6/site-packages/django/db/transaction.py
in inner
              return func(*args, **kwargs) ...
/home/user/ve/Project/lib/python2.6/site-packages/django/contrib/admin/options.py
in change_view
          if form.is_valid(): ...
/home/user/ve/Project/lib/python2.6/site-packages/django/forms/forms.py
in is_valid
      return self.is_bound and not bool(self.errors) ...
/home/user/ve/Project/lib/python2.6/site-packages/django/forms/forms.py
in _get_errors
          self.full_clean() ...
/home/user/ve/Project/lib/python2.6/site-packages/django/forms/forms.py
in full_clean
      self._clean_fields() ...
/home/user/ve/Project/lib/python2.6/site-packages/django/forms/forms.py
in _clean_fields
                  value = field.clean(value, initial) ...
/home/user/Devel/Project/project-cms/project/forms.py in clean
      w, h = get_image_dimensions(image) ...
/home/user/ve/Project/lib/python2.6/site-packages/django/core/files/images.py
in get_image_dimensions
      file = open(file_or_path, 'rb') ...

get_image_dimensions方法的导入方式如下:从django.core.files.images导入get_image_dimensions

这是清洁功能的主体:

def clean(self, value, initial=None):
    image = super(TheImageField, self).clean(value, initial)
    if image is None: return
    w, h = get_image_dimensions(image)
    if w != TheImageField.required_width or h != TheImageField.required_height:
        error_message = self.error_messages['incorrect_size'] % (w,h,)
        raise util.ValidationError(error_message)
    return image

函数get_image_dimensions的签名如下:

def get_image_dimensions(file_or_path, close=False)

file_or_path应该是磁盘中文件的字符串,而不是ImageField,因此会出现错误。

你可以这样做:

def clean(self, value, initial=None):
    image = super(TheImageField, self).clean(value, initial)
    if image is None: return
    # this is where I changed the code to add image.path
    w, h = get_image_dimensions(image.path)
    if w != TheImageField.required_width or h != TheImageField.required_height:
        error_message = self.error_messages['incorrect_size'] % (w,h,)
        raise util.ValidationError(error_message)
    return image

希望这能有所帮助!

最新更新