使用手动文件上传时,在将文件保存到模型之前,是否需要将文件放在最终位置?或者,模型是否在某个时刻移动文件?如果我确实需要自己放置,为什么我需要模型字段中的upload_to
参数?这似乎我必须与upload_to
param和我用来复制它的逻辑保持一致。
我想我只是感到困惑。有人可以帮我这么做吗?
我的表单来自网络的图片网址:
class ProductForm(ModelForm):
main_image_url = forms.URLField()
# etc...
我的视图检索它,检查它并制作缩略图:
main_img_temp = NamedTemporaryFile(delete=True)
main_img_temp.write(urllib2.urlopen(main_image_url).read())
main_img_temp.flush()
img_type = imghdr.what(main_img_temp.name)
if not img_type:
errors = form._errors.setdefault("main_image_url", ErrorList())
errors.append(u"Url does not point to a valid image")
return render_to_response('add_image.html', {'form':form}, context_instance=RequestContext(request))
# build a temporary path name
filename = str(uuid.uuid4())
dirname = os.path.dirname(main_img_temp.name)
full_size_tmp = os.path.join(dirname, filename+'_full.jpg')
thumb_size_tmp = os.path.join(dirname, filename+'_thumb.jpg')
shutil.copy2(main_img_temp.name, full_size_tmp)
shutil.copy2(main_img_temp.name, thumb_size_tmp)
# build full size and thumbnail
im = Image.open(full_size_tmp)
im.thumbnail(full_image_size, Image.ANTIALIAS)
im.save(full_size_tmp, "JPEG")
im = Image.open(thumb_size_tmp)
im.thumbnail(thumb_image_size, Image.ANTIALIAS)
im.save(thumb_size_tmp, "JPEG")
# close to delete the original temp file
main_img_tmp.close()
### HERE'S WHERE I'M STUCK. This doesn't move the file... ####
main_image = UploadedImage(image=full_size_tmp, thumbnail=thumb_size_tmp)
main_image.save()
在我的模型中,我有一个具有基本字段的UploadedImage模型:
class UploadedImage(models.Model):
image = models.ImageField(upload_to='uploads/images/%Y/%m/%d/full')
thumbnail = models.ImageField(upload_to='uploads/images/%Y/%m/%d/thumb/')
答案 0 :(得分:0)
通常,当您保存模型时,它会将文件写入指向upload_to
的位置。它自己处理,所以你不需要手动完成它。
在这里,您正在将文件写入临时文件,然后移动它以及可以自动完成的许多操作。检查answer to this question他还使用urllib
获取图像并将其保存到数据库中。
请注意,您可以在内存中传递缓冲区以创建适合执行缩略图逻辑的FileField
或ImageField
。您也可以考虑将django-thumbnails
用于此目的。它是一个很好的图书馆。
希望这有帮助!
答案 1 :(得分:0)
回答我自己的问题......
当我将路径传递给模型中的ImageField时,我只是递给它一条路径。我现在看到要调用Django内置的所有存储处理,你必须提交一个File
对象。这足以使其复制到upload_to
路径:
from django.core.files import File
main_image = UploadedImage(image=File(open(full_size_tmp)), thumbnail=File(open(thumb_size_tmp)), creator=request.user)
main_image.save()