Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django错误';QuerySet';对象没有属性';阅读';_Python_Django - Fatal编程技术网

Python Django错误';QuerySet';对象没有属性';阅读';

Python Django错误';QuerySet';对象没有属性';阅读';,python,django,Python,Django,我对Python和Django非常陌生。我正在尝试为我的一个基于图像的网站调整我的图像大小。我有一个视图,它实际渲染了所有图像,这些图像正在使用基本宽度重新调整大小,如下所示 import PIL from PIL import Image,ImageDraw, ImageFont, ImageEnhance def showphoto(request,template = 'base.html',page_template = 'photo/showphoto.html'): bas

我对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)

现在问题出在哪里,请仔细查看我的代码。

看起来您将图像查询集视为单个图像。您可能需要对结果进行迭代,并一次处理一个图像


错误的原因是,您将queryset发送到
Image.open()
,将其视为类似文件的对象。只有当您试图获取有关图像的信息时,库才会尝试读取“文件”,结果发现它毕竟不是一个for,因为它没有实现
read
方法。

首先,由于您对Python和Django不熟悉,最好先从它开始,而不是从Pil开始,因为它基本上没有维护,自Django 1.6以来,枕头是首选库

其次,在视图中调整图像大小不是首选的方法。此外,您每次都在调整图像的大小。更常见的方法是使用templatetag,如

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


Photo.objects.order_by('-upload_time')返回QuerySet(照片列表)和img=Image.open(照片)尝试打开Photo
Image的QuerySet。open
需要图像文件的路径,而不是QuerySet。因此出现了错误。我使用了您的代码模式,但它仍然显示了我之前遇到的相同错误,即**照片对象在图像处没有属性“读取”。打开(照片)**是的,您应该使用用于在
照片
模型中保存实际照片路径的字段。你能向我们展示一下吗?我已经更新了我的帖子。看,我已经添加了我的照片模型。现在,在使用更新的答案后,我遇到了一个错误“save()接受至少2个参数(1个给定)”。很抱歉,我还是一个新手。如果你需要调整大小保存纵横比,只需忽略你想要缩放的大小。在您的情况下,
{%im%的缩略照片“300”}
# 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]