Python Django错误'QuerySet'对象没有属性'read'

时间:2014-08-07 13:17:41

标签: python django

我是Python和Django的新手。我正在尝试为我的一个基于图像的网站调整图像大小。我有一个实际渲染所有图像的视图,这些图像使用基本宽度进行重新调整,如下所示。

import PIL
from PIL import Image,ImageDraw, ImageFont, ImageEnhance

def showphoto(request,template = 'base.html',page_template = 'photo/showphoto.html'):
    basewidth = 300

    photos = Photo.objects.order_by('-uploaded_time')
    img = Image.open(photos)
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
    photo_list=img.save(photos)


    context = {}
    context.update({
    'photo_list': photo_list,
    'page_template': page_template,
    })

    if request.is_ajax():
        template = page_template
    return render_to_response(template,context,context_instance=RequestContext(request))

但是我正面临一个错误......

 AttributeError at /showphoto/
'QuerySet' object has no attribute 'read' 

这是我的照片模型..

class Photo(models.Model):
    name = models.CharField(max_length = 100)
    photo = models.ImageField(upload_to = 'photos', blank=False,null=True)
    approved = models.BooleanField(default = False)
    uploaded_time = models.DateTimeField()
    description = models.CharField(max_length = 80 , blank = False , null = True)
    keyword = models.CharField(max_length = 200 , blank = False , null = True)
    image_id = models.CharField(max_length=300, blank=True, null=True)
    Certified = models.BooleanField(default = False)
    approved_by = models.CharField(max_length = 100)
    user = models.ForeignKey(User)
    total_download = models.IntegerField(default=0)
    watermarked_image = models.ImageField(upload_to = 'temp', blank=True,null=True)

现在问题是什么,请仔细查看我的代码。

2 个答案:

答案 0 :(得分:2)

首先,由于你是Python和Django的新手,最好从Pillow而不是Pil开始,因为它基本上没有维护,Pillow是自Django 1.6以来的首选库。

其次,在视图中调整图像大小并不是首选方法。此外,您每次都在调整图像大小。更常见的方法是使用sorl-thumbnail等模板标签。

至于特定错误,正如Platinum Azure所说,您将查询集实例传递给需要文件对象或路径的函数。如果你想继续你的方法,你可以迭代你的查询集(没有测试!):

# Outside your view
def resize_photo(photo):
    img = Image.open(photo)
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
    img.save()        
    return img

# In your view
photo_list = [resize_photo(p.photo) for p in photos]

答案 1 :(得分:0)

您似乎将图像的查询集视为单个图像。您可能需要迭代结果并一次处理一个图像。

错误来自于您通过将查询集发送到Image.open()来将其视为类文件对象。只有当你试图获取有关图像的信息时,图书馆才会尝试阅读"文件"只是为了发现它并不是最终的,因为它没有' t实现read方法。

相关问题