2011-10-21 2 views
1

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

Первоначально предполагалось, что расширение 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/

ответ

3

Вы можете использовать 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) 
+0

Спасибо! Это очень помогло. Хотя я чувствую себя грязным. Это похоже на наименее элегантную вещь, которую мне когда-либо приходилось писать в джанго. – oliverseal

3

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

+0

Спасибо, это было полезно. – oliverseal