Python Django错误';QuerySet';对象没有属性';阅读';
我对Python和Django非常陌生。我正在尝试为我的一个基于图像的网站调整我的图像大小。我有一个视图,它实际渲染了所有图像,这些图像正在使用基本宽度重新调整大小,如下所示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
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]