如何在Django中不显示原始图片名称

时间:2014-02-25 02:43:25

标签: django image django-models

我正在构建一个用户可以上传图片的Django项目。我想知道如何不显示原始图片名称。

我希望网址类似于/ pic / randomnumber,当从网站下载图片时,它的名称为randomnumber.jpg。例如,Tumblr上的所有图片都有名称tumblr_blabla.jpg。

我认为这应该是在models.py中完成的,但我不太清楚如何实现它。

2 个答案:

答案 0 :(得分:0)

IMO你应该在模型中编写方法保存 这样的事情:

from PIL import Image
import os


class YOURS_MODEL_NAME(models.Model):
    photo = models.ImageField(upload_to="photos")
    def save(self, miniature=True):
        super(YOURS_MODEL_NAME, self).save()
        if miniature:
             filepath = self.photo.path


             image = Image.open(filepath)           
             new_filepath = filepath.split('.')
             new_filepath = '.'.join("HERE YOU CAN ADD EVERYTHING TO PATH TO THIS PHOTO") + "." + new_filepath[-1].lower()

            try:
                image.save(new_filepath, quality=90, optimize=1)
            except:
                image.save(new_filepath, quality=90)

            photo_name = self.photo.name.split('.')
            photo_name = '.'.join("HERE YOU CAN ADD EVERYTHING YOU WANT TO 'PHOTO NAME'") + "." + photo_name[-1].lower()
            self.photo = photo_name

            self.save(miniature=False)

            # remove old image
            os.remove(filepath)

答案 1 :(得分:0)

模型定义中的upload_to参数可以是一个可调用函数,可用于自定义文件名。取自Django文档 FileField(其中ImageField是子类):

upload_to 有两个参数: instance filename ,(其中 filename 是原始文件名,你是也可以选择忽略)。

models.py 中的类似内容应该可以解决问题:

def random_filename(instance, filename):

    file_name = "random_string" # use your choice for generating a random string!

    return file_name


class SomeModel(models.Model):
    file = models.ImageField(upload_to=random_filename)

(这类似于答案this question about FileFields)。

如果您沿着这条路走下去,我建议您使用散列/校验和或文件上传的日期/时间。这些方面的东西应该有用(虽然我自己没有测试过!):

from hashlib import sha1

def unique_filename(instance, field):

    filehash = sha1()

    for chunk in getattr(instance, field).chunks():
        filehash.update(chunk)

    return filehash

class SomeModel(models.Model):
    file = models.ImageField(upload_to=unique_filename(field='file'))

希望这有帮助!