人类可读的文件名

时间:2015-11-25 11:23:47

标签: django imagefield

每当我使用名为moon.png的文件创建ImageField时,Django正确地按照我的配置设置,将文件放入:

campaign/primary-banner/2015/11/25/moon.png

campaign/primary-banner/2015/11/25/moon_RcJ3FuD.png

这就是imagefield.name的价值,我可以向用户展示,但用户并不友好。

我想显示ImageField.name的名称,但是以人类可读的格式显示。是否可以从moon.png中提取原始文件名(ImageField)?我能想到的解决方法是:

  • 在我的模型中添加一个额外的字段以保存人类可读的文件名。额外的工作,我想避免:干。
  • 处理imagefield.name值以提取原始文件名,但这似乎太复杂了(我需要准确理解django首先如何生成文件名,以确保我覆盖角落的情况)

1 个答案:

答案 0 :(得分:0)

我有类似的问题并通过在MEDIA_ROOT下创建我自己的子目录来解决它,其中我使目录结构包含日期和一些唯一标识符。然后我将我的文件移动到最后的子目录,并将名称放到FileField.name。一切都像魅力一样 - 文件是独一无二的(感谢独特的目录),最终的名字正是我想让用户看到的(因为没有必要重命名 - 不可能发生冲突)

p.filename=get_filename_of_existing_file_to_be_stored()
p.originalfilename=get_how_it_should_be_named()
masterobject=MyNewMaster.objects.get(pk=some_id)
uniq_name=masterobject.make_something_unique()


new_object=MyObject()
new_object.master=masterobject
new_object.some_fields=some_values
daystr=date.today().strftime('%y-%m-%d')
directory='MyDir/%s/%s/%s/'%(daystr,masterobject.id,uniq_name)
if not os.path.exists(os.path.join(settings.MEDIA_ROOT,directory)):
    os.makedirs(os.path.join(settings.MEDIA_ROOT,directory))
fname=os.path.join(directory,p.originalfilename)
os.rename(p.filename,os.path.join(settings.MEDIA_ROOT,fname))
new_object.filename = fname
new_object.save()

现在everthing对我有效并且没有冲突是可能的,甚至Django似乎对这个hack感到满意,并为我试图用MyObject做的一切提供了正确的文件名和URL:)

现在我以路径结束了:

MyDir/2015-11-29/12345/child_7/moon.png