2013-06-28 81 views
1

当使用清除复选框删除上传的图片,然后点击保存在Django管理界面时,得到如下结果:Django的Unicode的错误从管理界面删除的ImageField时

类型错误在/管理/富/酒吧/ 1/

胁迫到Unicode:需要字符串或缓冲区,ImageFieldFile发现

异常值:强迫为Unicode:需要字符串或缓冲区,ImageFieldFile发现 异常位置:/首页/ EC2用户/ VE /项目/ lib目录/ python2.6的/站点包/ Django的/ CO再在get_image_dimensions /文件/ images.py 47行

我知道,这可能是与unicode的类型返回,以便从return image在相关ImageField代码变更为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 
+0

向我们展示'get_image_dimensions'函数 – lalo

回答

1

The signature for function 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 

希望这有助于!

+0

谢谢您,在该位置更改为'image.path'会停止崩溃,但图像不会被删除。此外,这现在使上传图像崩溃与此日志消息:'“InMemoryUploadedFile”对象没有属性“路径”' – JKSW

+0

似乎有区别,如果clean()基本上调用上传或删除。 – JKSW

+0

那么,我的回答就是指出你如何错误地调用get_image_dimensions。你必须修改你的'clean'方法的逻辑才能正确。 –