python - 覆盖模型 save() 会导致 Django Admin 出错

标签 python django python-imaging-library

我有一个模型要保存在 Django Admin 中

class Product(models.Model):
    # other fields
    img1 = models.ImageField(upload_to='%s/%s/1/large/' % (category, prod_no))
    img1_thumb = models.ImageField(upload_to='%s/%s/1/thumbnail/' % (category, prod_no), editable=False)

    def save(self, *args, **kwargs):
        newImg1  = resizeImg(self.img1, (75, 112))
        self.img1_thumb = newImg1
        super(Product, self).save(*args, **kwargs)

调整图像大小的功能

def resizeImg(image, size):
    try:
        if imghdr.what(image) == 'jpeg':
            img = Image.open(image)
            img.thumbnail(size, Image.ANTIALIAS)

            # this is how to save the img
            # img.save(filename + '.jpg', 'JPEG', quality=75)

            return img
        else:
            return 'not_jpg'

    except Exception, e:
        return 'exception'

在 Django Admin 中保存这个会产生这个错误

AttributeError at /admin/myapp/product/add/
_committed

更新 - 完整追溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/admin/myapp/product/add/

Django Version: 1.3.1
Python Version: 2.7.1
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'bc']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in wrapper
  307.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/sites.py" in inner
  197.             return view(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapper
  28.             return bound_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in bound_func
  24.                 return func(self, *args2, **kwargs2)
File "/Library/Python/2.7/site-packages/django/db/transaction.py" in inner
  217.                 res = func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in add_view
  882.                 self.save_model(request, new_object, form, change=False)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in save_model
  665.         obj.save()
File "/Users/rocky/Projects/BestChoose/bc/models.py" in save
  66.         super(Product, self).save(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save
  460.         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save_base
  543.                         for f in meta.local_fields if not isinstance(f, AutoField)]
File "/Library/Python/2.7/site-packages/django/db/models/fields/files.py" in pre_save
  253.         if file and not file._committed:
File "/Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.7-intel.egg/Image.py" in __getattr__
  512.         raise AttributeError(name)

Exception Type: AttributeError at /admin/myapp/product/add/
Exception Value: _committed

最佳答案

你不能这样做:

newImg1  = resizeImg(self.img1, (75, 112))
self.img1_thumb = newImg1

您正在将图像分配给需要文件的字段。您需要先从图像创建一个文件。请参阅 this snippet,而不是再次全部输入。详细说明了正确的方法。

您还可以使用 thumbnailing applications 中的任何一个可用于简化您的代码。 solr-thumbnail是最受欢迎的之一。

关于python - 覆盖模型 save() 会导致 Django Admin 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9496528/

相关文章:

python - 如何将 Flask/WTForms SelectField 添加到我的 HTML 中?

python - 导入错误 : No module named requests

python - 如何使用paste()重叠两个或多个图像?

python - 使用 Selenium + Python 滚动到元素后的元素屏幕截图?

python - 使用 Python 图像库模糊包含文本的图像

python - 连接模板和 View 分页

django - django的annotate()功能中过滤相关字段

python - 为什么 django 的 create_user 方法不验证唯一性?

Python:将 Quill delta 转换为 HTML

python - 从文本文件中搜索一行中的单词时,某些单词未显示