2012-06-10 6 views
4

Ive недавно experiementing с помощью Джангоdjango доступ к загружаемым файлам в пользовательскую настройку модели, лучшую практику?

Я хочу, чтобы иметь возможность запускать загруженный файл через ImageMagick на модели функции сохранения, я понял, что это было невозможно из-за файл не доступен, пока экземпляр был спас

Я получил это работает были спасброски вызываются при старте, который затем позволяет получить доступ к загруженному файлу затем повторно сохраняет один раз его заселили другие поля

есть ли лучший способ для достижения этой цели? это просто своего рода чувствует себя неправильно называть функцию сохранения дважды pre_save сигнал

class uploadedFiles(models.Model): 
orignal_image = models.FileField(upload_to='userimages/') 
user = models.ForeignKey(User) 
description = models.TextField(blank=True) 


def __unicode__(self,force_insert=False, force_update=False): 
    return "%s uploaded by %s" % (self.orignal_image.path, self.user) 

def save(self, force_insert=False, force_update=False): 
    super(uploadedFiles, self).save() 
    s = '' 
    cmd = subprocess.Popen(['identify', '-verbose', self.orignal_image.path], stdout=subprocess.PIPE) 
    for line in cmd.stdout: 
     s += line 
    self.description = s 
    super(uploadedFiles, self).save() 

ответ

-1

Используйте Джанго (docs см также Signals в документации Джанго):

from django.db.models.signals import pre_save 
from myapp.models import MyModel 

def do_something(sender, **kwargs): 
    pass 
pre_save.connect(do_something, sender=MyModel) 

Django теперь называть do_something перед сохранением MyModel объектов.

0

Лучше, если вы используете функции библиотеки изображений для сбора метаданных изображений. Затем вам просто нужно прочитать данные изображения из экземпляра FileStorage поля изображения. Просто проверьте на documentation of file uploads. Кроме того, при использовании Django's ImageField он проверяет загруженный файл, чтобы увидеть, является ли он допустимым файлом изображения, проверьте код для ImageField в качестве базовой линии, чтобы получить дополнительную информацию об изображении.

Я бы определил метод clean модели, и это вызовет вызов непосредственно перед вызовом метода модели save. В clean, затем проверьте поток данных поля изображения с помощью функций PIL для получения метаданных (или любой другой библиотеки, которую вы хотите использовать для этого, до тех пор, пока он принимает поток данных, не физический файл), а затем заполните поле описания с метаданными.

Использование API хранения Django лучше, поэтому вы можете извлекать метаданные из файлов, хранящихся в облаке (например, Amazon S3), а не только из тех, которые хранятся в локальной файловой системе, что делает код более переносимым для развертывания.

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

  • Нет связанных вопросов^_^