首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以编程方式将图像保存到Django ImageField

以编程方式将图像保存到Django ImageField
EN

Stack Overflow用户
提问于 2009-08-21 03:42:39
回答 20查看 164.5K关注 0票数 230

好了,我已经尝试了几乎所有的方法,但我不能让它工作。

  • 我有一个带有ImageField的Django模型
  • 我有通过HTTP下载图像的代码(经过测试并正常工作)
  • 图像直接保存到' upload_to‘文件夹(upload_to是在ImageField)
  • All上设置的)我需要做的是将已经存在的图像文件路径与ImageField

关联起来

我已经用6种不同的方式写了这段代码。

我遇到的问题是我正在编写的所有代码的结果如下:(1) Django将生成第二个文件,(2)重命名新文件,在文件名的末尾添加一个_,然后(3)不传输任何数据,基本上将其保留为一个空的重命名文件。'upload_to‘路径中剩下的是两个文件,一个是实际的图像,另一个是图像的名称,但是是空的,当然,ImageField路径被设置为Django试图创建的空文件。

如果这一点不清楚,我将尝试说明:

代码语言:javascript
复制
## Image generation code runs.... 
/Upload
     generated_image.jpg     4kb

## Attempt to set the ImageField path...
/Upload
     generated_image.jpg     4kb
     generated_image_.jpg    0kb

ImageField.Path = /Upload/generated_image_.jpg

在不让Django尝试重新存储文件的情况下,我如何做到这一点?我真正想要的是这样的东西……

代码语言:javascript
复制
model.ImageField.path = generated_image_path

...but当然不起作用。

是的,我已经在这里讨论了其他问题,比如this one以及File上的django文档

更新在进一步测试后,它只有在Windows Server上的Apache下运行时才会执行此行为。在XP的“runserver”下运行时,它不会执行此行为。

我被难住了。

下面是在XP上成功运行的代码...

代码语言:javascript
复制
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2009-08-21 01:32:51

我有一些代码可以从web上获取图像并将其存储在模型中。重要的部分是:

代码语言:javascript
复制
from django.core.files import File  # you need this somewhere
import urllib


# The following actually resides in a method of my model

result = urllib.urlretrieve(image_url) # image_url is a URL to an image

# self.photo is the ImageField
self.photo.save(
    os.path.basename(self.url),
    File(open(result[0], 'rb'))
    )

self.save()

这有点令人困惑,因为它脱离了我的模型,有点脱离了上下文,但重要的部分是:

  • 从web中提取的图像不存储在upload_to文件夹中,而是由urllib.urlretrieve()存储为临时文件,稍后将其丢弃。
  • ImageField.save()方法接受一个文件名( os.path.basename位)和一个django.core.files.File对象。

如果您有问题或需要澄清,请告诉我。

编辑:为了清楚起见,这里是模型(减去任何必需的import语句):

代码语言:javascript
复制
class CachedImage(models.Model):
    url = models.CharField(max_length=255, unique=True)
    photo = models.ImageField(upload_to=photo_path, blank=True)

    def cache(self):
        """Store image locally if we have a URL"""

        if self.url and not self.photo:
            result = urllib.urlretrieve(self.url)
            self.photo.save(
                    os.path.basename(self.url),
                    File(open(result[0], 'rb'))
                    )
            self.save()
票数 190
EN

Stack Overflow用户

发布于 2012-10-16 23:11:29

如果模型尚未创建,则非常简单:

在第一个中,将您的图像文件复制到上传路径(假设在下面的代码片段中为=‘/’)。

Second,使用如下所示:

代码语言:javascript
复制
class Layout(models.Model):
    image = models.ImageField('img', upload_to='path/')

layout = Layout()
layout.image = "path/image.png"
layout.save()

在django 1.4中测试和工作,它可能也适用于现有的模型。

票数 112
EN

Stack Overflow用户

发布于 2010-07-24 09:37:21

只是一点小小的评论。tvon answer可以工作,但是,如果你在windows上工作,你可能想用'rb' open()这个文件。如下所示:

代码语言:javascript
复制
class CachedImage(models.Model):
    url = models.CharField(max_length=255, unique=True)
    photo = models.ImageField(upload_to=photo_path, blank=True)

    def cache(self):
        """Store image locally if we have a URL"""

        if self.url and not self.photo:
            result = urllib.urlretrieve(self.url)
            self.photo.save(
                    os.path.basename(self.url),
                    File(open(result[0], 'rb'))
                    )
            self.save()

否则,您的文件将在第一个0x1A字节处被截断。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1308386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档