【问题标题】:Django - Changing file name on ImageFieldDjango - 在 ImageField 上更改文件名
【发布时间】:2011-12-14 22:30:50
【问题描述】:

我已阅读有关此主题的其他问题,但没有一个能够真正回答我的问题。

我让用户在向网站提交特定项目时上传图片。每个用户可以提交多件商品,每件商品有一张图片。

问题是,我不想用原始文件名保存图片。我想用项目的 ID 保存它。因此,如果用户提交了一个 Banana 项目,该项目的 ID 为 5,文件名为

banana.jpg

我希望它保存为

site_media/items/5.jpg

而不是

site_media/items/banana.jpg

这是 Django 自动执行的操作。

现在的问题是,当我从表单中获取 POST 多部分数据时,我已经将图片保存为 site_media/items/item_ID.jpg。但是,当我尝试在模板上显示字段 item.picture 时,它​​会尝试访问

 site_media/items/banana.jpg

而不是

site_media/items/5.jpg

哪个是实际存在的文件。所以我得到了一个损坏的链接。

我试图更改 picture.path 属性,希望它只是 Django 在链接图像时读取的字符串,但 Django 给了我一个异常,这让我认为它可能是别的东西。

当然,如果有一种解决方案,我希望在保存时只更改文件名,而不是删除具有原始文件名的文件并使用新名称保存副本,以实现良好的实践和效率目的。

有人可以帮我吗?谢谢。

型号代码:

class Item(...):
    ...
picture = models.ImageField(
    upload_to="site_media/items/",
    max_length=512,
    null=True,
    default=''
)

这是处理 POST 表单的函数:

item = Item.objects.create(... data from form)
try:
    picture = FILES['picture']
    print str(picture)

    destination = open('site_media/items/'+str(item.id)+".png", 'wb+')
    for chunk in picture.chunks():
        destination.write(chunk)
    destination.close()

    item.picture = picture
except Exception:
    messages.error(request, "Picture for item not loaded successfully")

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以为图像字段上的upload_to 参数提供回调。将为指定的函数提供将要保存的当前实例。参见例如。 this example。 此解决方案的问题是,新实例可能还没有 Id,因此使用 UUID 之类的东西来生成文件名可能是有意义的,因此如果您有更多内容,您也可以轻松避免冲突比一个文件的实例!看看python docs 用于生成 UUID!

    【讨论】:

      【解决方案2】:

      找到了解决办法。所以,问题是request.FILES 包含与保存的文件名不同的文件名。所以我只是在保存图像之前更改了request.FILES 文件名,如下所示:

      picture = FILES['picture']
      FILES['picture'].name = str(item.id) + '.png'
      
      # ...save as normal
      

      【讨论】:

      • 对于尚未保存到数据库的新项目,此方法将失败,因此会导致重复代码。使用upload_to 回调真的没那么难。
      猜你喜欢
      • 2013-02-14
      • 2012-09-09
      • 2019-01-05
      • 2011-04-28
      • 2012-12-11
      • 1970-01-01
      • 2012-06-02
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多