以编程方式保存ImageField复制图像文件

时间:2012-07-09 17:30:40

标签: django imagefield

我正在从csv文件创建下面显示的Item模型的一些实例。在csv文件中,仅指定了项目的namefilename。通过查看图像是否存在来设置image字段,如果存在,则将图像文件设置为image

我做:

item = Item()
item.name = csv_fields[0]
item.filename = csv_fields[1]
item.save()

...

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r')
item.image = File(f)
item.save()

这样,图片在settings.MEDIA_ROOT+"images/"中与<original filename>_1重复。怎么可以避免呢?即,我怎样才能将现有文件设置为图像场而不复制它?

class Item(models.Model):   

    name = models.CharField(max_length=50)
    filename = models.CharField(max_length=100,)
    image = models.ImageField(upload_to='images', blank=True, null=True)

2 个答案:

答案 0 :(得分:2)

这就是你所需要的一切

item = Item()
item.name = csv_fields[0]
item.filename = csv_fields[1]
item.image = csv_fields[1]
item.save()

图像字段采用文件名和字段定义的upload_to,并将其转换为图像资源。如果你传入一个图像资源,它认为它是一个新的。

这样:

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r')
item.image = File(f)

根本不需要

charfield和image字段之间唯一的差异是imagefield获取文件名并将其转换为PIL Image资源以进行进一步操作。它只是一个包装。

答案 1 :(得分:1)

Francis Yaconiello的回答是正确的,但我有一个明确的细节。

item.image = csv_fields[1]

请注意,这应该是相对于媒体根或其他存储根目录的路径。

例如,请说settings.MEDIA_ROOT = '/home/myuser/media'ImageField(upload_to='images')

因此,如果您手动将图像保存在`/home/myuser/media/images/purty.jpg',那么csv_fields [1]应为:

item.image = '/images/purty.jpg'

其他方面,item.image.name,item.image.path和item.image.url将搞砸。