Django的admin site组件被誉为“皇冠上的明珠”,经过最近的体验,确实很大的提高开发速度,不过应为其高定制性,似乎也给灵活性方面带来了一些困扰。
Django的文件上传,默认是保存为原文件名的,我点破鼠标也没找到Django提供的重命名方法,百google毒之后发现似乎只能重写相关的field,或者直接重写FileSystemStorage来实现对上传文件的重命名。不过按照目前的需求,在admin中重写相关的field更现实/灵活一点,所以翻了会Django的源码,稍微重写了一下。
from django.db.models.fields.files import ImageField, ImageFieldFile
class CoverImageFieldFile(ImageFieldFile):
def save(self, name, content, save=True):
import time, random
parts = name.split(".")
new_name = time.strftime('%Y%m%d%H%M%S')
new_name += '%d' % random.randint(1000,9999)
new_name += '.%s' % parts[-1]
super(CoverImageFieldFile, self).save(new_name, content, save)
class CoverImageField(ImageField):
attr_class = CoverImageFieldFile
def __init__(self, *args, **kwargs):
super(CoverImageField, self).__init__(*args, **kwargs)
我这里按照当前时间+四个随机数的方式对上传图片重命名,然后把新的文件名作为参数,直接调用父类的方法来保存文件就OK了。使用的时候使用这个自定义的field替代Django的,就能实现上传之后重命名
我个人还是比较喜欢对原有类库影响非常小的方式来实现需要的功能,这样在版本升级的时候就不用头皮发麻的再修改一次(没办法,我的版本控属性太高)。
现在对Django的了解还很少,或者还所很肤浅,因此对于一些想法的实现估计很幼稚。慢慢来吧,下一步是要实现admin里的图片预览和异步上传...对于目前阶段的我来说,比较艰巨阿。今天考虑,这些高级的实现推后才行,因为项目时间已经不允许了,只能留在上线后去实现这些。一口吃不成胖子哈,原本使用Django来做后台就是为了加快开发速度,不能因为这个又耽误了不是~~~
大侠,你可以给你的blog加一下高亮不?
@TualatriX 昨晚没找找以前的那个插件,今天再找找
纯路过。。。。
还是重写field好一点,hack代码的不是好孩子
重载save方法不行么
重载save不够灵活吧。。。。
这个我都没有用过。最近在学PYTHON。 貌似国内用python来用程序的公司好少 (我是blog的忠实读者,希望可以给点学PYTHON的启示)
@firefoxmmx 呵呵,我也是python大白菜。。。
我就是萝卜
现在一般都用PYTHON来做什么呢?