Django - 在ImageField上更改文件名

0 django django-models

我已经阅读了关于这个主题的其他问题,但实际上没有回答我的问题.

我让用户在向网站提交某个项目时上传图片.每个用户都可以提交多个项目,每个项目都有一个图片.

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

banana.jpg
Run Code Online (Sandbox Code Playgroud)

我希望它保存为

site_media/items/5.jpg
Run Code Online (Sandbox Code Playgroud)

并不是

site_media/items/banana.jpg
Run Code Online (Sandbox Code Playgroud)

这是Django自动执行的操作.

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

 site_media/items/banana.jpg
Run Code Online (Sandbox Code Playgroud)

代替

site_media/items/5.jpg
Run Code Online (Sandbox Code Playgroud)

哪个是实际存在的文件.所以我得到了一个破碎的链接.

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

此外,当然,我更喜欢有一个解决方案,我只是在保存时更改文件名,而不是使用原始文件名删除文件并保存带有新名称的副本,以达到良好的实践和效率目的.

有谁可以帮我这个?谢谢.

型号代码:

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

这是处理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")
Run Code Online (Sandbox Code Playgroud)

Ber*_*ant 6

您可以upload_to在图像字段上提供对参数的回调.将为将保存的当前实例提供指定的函数.见例如.这个例子.这个解决方案的问题是,一个新实例可能还没有Id,所以使用类似UUID的东西生成文件名是有意义的,所以你也可以轻松避免冲突,如果你有多个一个实例的文件!看看用于生成UUID 的python文档!