Django ImageField / FileField сохраняет загруженный файл, используя pk модели - PullRequest
1 голос
/ 21 октября 2011

Я конвертирую старый сайт (изначально написанный в рельсах), и по умолчанию изображения были сохранены в формате {{pk}}.{{extension}}, и этот файл всегда перезаписывался при загрузке нового файла. Я бы хотел продолжить этот формат с этой версией django.

Изначально я думал, что расширение FileSystemStorage будет хорошим способом, но я не знаю, как передать ему объект текущей модели. У кого-нибудь есть предложение о «способе Джанго» для достижения этой цели?

Если мне нужно написать собственный класс, который расширяет ImageField, чтобы справиться с этим, пусть будет так. :) Просто интересно, было ли что-то простое, что мне не хватает.

[править] Что я сделал, основываясь на ответе от surfeurx и DrTyrsa :

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/

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Вы можете использовать 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)
3 голосов
/ 21 октября 2011

Вам необходимо определить функцию upload_to.Он принимает instance в качестве аргумента.Но не забывайте, что если вы создаете экземпляр, у него еще не будет pk (но вы можете сначала сохранить его, а затем сохранить изображение).

...