Skip to main content
 首页 » 编程设计

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

2025年05月04日25落叶无声

我有一个模型要保存在 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是最受欢迎的之一。