2012-04-10 3 views
0

Мне нужно сохранить без полного пути к файлу также имя файла. Я делаю так:Как сохранить имя файла загруженного файла в модели

class Photo(models.Model): 
    photo = models.ImageField(upload_to = settings.PATH_PHOTOS_SOURCE) 
    user = models.ForeignKey(UserProfile, editable=False) 
    item = models.ForeignKey(Item, default=0) 
    filename = models.CharField(max_length=100, default='', editable=False) 

    def save(self, *args, **kwargs): 
     self.filename = os.path.basename(self.photo.url) 
     super(Photo, self).save(*args, **kwargs) 

Это работа, но существуют случаи, когда файл с существующим именем уже существует, и Offcourse в диске файл записи example_1.jpg, example_2.jpg, но в имени файла сохранения некорректное имя файла example.jpg

я изменил метод сохранения так:

def save(self, *args, **kwargs): 
    super(Photo, self).save(*args, **kwargs)   
    self.filename = os.path.basename(self.photo.url) 
    super(Photo, self).save() 

это работа, но я не люблю этот код, может быть, более элегантный код.

Я пытался сделать это с помощью сигналов, но у меня была проблема с сохранением рекурсии.

ответ

2

Вместо settings.PATH_PHOTOS_SOURCE, pass a function to upload_to.

def upload_path_handler(self, filename): 
    return os.path.join(settings.PATH_PHOTOS_SOURCE, 
         os.path.basename(self.photo.url)) 

# in model 
photo = models.ImageField(upload_to=upload_path_handler) 

Если вы хотите использовать модель идентификатор экземпляра для файла, исх Django admin file upload with current model id

Вы, возможно, потребуется рассмотреть возможное значение photo.url, чтобы убедиться, что его безопасным непосредственно использовать его в качестве имени файла.

+0

Спасибо. Отличная идея. – yAnTar

Смежные вопросы