簡體   English   中英

Django ImageField / FileField使用模型的pk保存上傳的文件

[英]Django ImageField/FileField save uploaded file using model's pk

我正在轉換舊站點(最初寫在rails中),默認情況下,圖像使用{{pk}}.{{extension}}格式保存,並且如果上載新文件,該文件始終被覆蓋。 我想在Django版本中繼續使用該格式。

我本來以為擴展FileSystemStorage是一種可行的方法,但是我不知道將當前模型對象傳遞給它的方法。 有人對“ django方式”提出建議嗎?

如果我需要編寫自己的擴展ImageField的類來管理ImageField ,那就這樣吧。 :)只是想知道我是否缺少一些簡單的東西。

[edit] 根據surfeurxDrTyrsa的回答做了 什么

temp_image = None

def image_path(self, uploaded_file_name):
    prefix = 'designs/'
    extension = os.path.splitext(uploaded_file_name)[-1]
    if self.pk != None:
        return prefix + str(self.pk) + extension
    else:
        tmp_name = str(uuid.uuid4())
        self.temp_image = prefix + tmp_name + extension
        return self.temp_image

image_upload = models.ImageField(upload_to=image_path, null=True, blank=True) 

def save(self):
    self.updated_at = datetime.now()

    is_new = self.pk == None
    super(Design, self).save()

    if is_new:
        if self.temp_image != None:
            os.rename(MEDIA_ROOT + self.temp_image, MEDIA_ROOT + self.image_path(self.temp_image))
            self.temp_image = None

我現在遇到的真正問題是我希望它覆蓋圖像。 這將提供正確的文件名,但是看起來我將不得不擴展ImageField使其覆蓋。 找到了這個小家伙: http : //djangosnippets.org/snippets/636/

您需要定義upload_to函數。 它接受instance作為參數。 但是請不要忘記,如果您正在創建實例,它將還沒有pk (但是您可以先保存它,然后保存圖像)。

您可以像這樣使用upload_to:

def image_path(instance, filename):
    return instance.id + os.path.splitext(filename)[1]

class Brand(models.Model):
    ...
    logo = models.ImageField(upload_to=image_path, null=True, blank=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM