2012-06-05 2 views
11

Я хочу, чтобы имена файлов, чтобы быть случайным и поэтому я использую upload_to функцию, которая возвращает случайное имя файла, как так:Django: Как сохранить исходное имя файла в FileField?

from uuid import uuid4 
import os 
def get_random_filename(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 

Однако я хотел бы сохранить исходное имя файла с атрибутом внутри модели. Что-то вроде этого не работает:

def get_random_filename(instance, filename): 
    instance.filename = filename 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

Как это сделать?

спасибо.

+0

Он отлично работает в моих тестах. Как именно он не работает для вас? Что происходит? Может быть, проблема в коде зрения? – rantanplan

+0

как только вы это сделаете и запросите объект из db, вы все еще видите значение для имени файла? – miki725

+0

Да. Я действительно протестировал его внутри оболочки. Я убил его, запустил его снова, и там было имя файла. На самом деле сначала я думал, что вы просто забыли сделать 'instance.save()' внутри get_random_filename. Но, похоже, это не нужно. – rantanplan

ответ

8

Опубликованный код нормально работает, возможно, фактический код

class FooModel(models.Model): 
    filename = models.CharField(max_length=128) 
    file = models.FileField(upload_to=get_random_filename) 

Примечание переключающего упорядочения указанных полей.

Это не будет работать, потому что: upload_to() вызывается pre_save(), here in the code, когда требуется действительное значение FileField. Вы можете обнаружить, что присвоение атрибуту filename в upload() происходит после генерирования первого параметра filename в вставленном sql. Таким образом, присваивание не вступает в силу в сгенерированном SQL и влияет только на сам экземпляр.

Если это не проблема, отправьте код, введенный в оболочку.

+0

То было прямо на месте. Я перепечатал основной код в вопросе, не понимая, что я отменил порядок. Большое спасибо!!!!! – miki725

+0

И спасибо за указание, где это происходит. Я копал все поля и моделировал код, но не думал о том, чтобы смотреть в sql. – miki725

+0

Кажется, что он сломан с Django 1.5 ... Я был вынужден добавить 'super (FooModel, self).save (update_fields = ['filename']) 'в моем методе сохранения переопределенной модели. Есть предположения ? – dulaccc

1

Вы можете пойти по пути заполнения имени файла во время сохранения. Очевидно, что вам нужно сохранить исходное имя файла в памяти при запуске get_random_filename.

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

    def save(self, force_insert=False, force_update=False): 
     super(FooModel, self).save(force_insert, force_update) 
      #Do your code here... 
+0

То, что мне не нравится в этом, заключается в том, что тогда спасение должно произойти в twise. Я бы предпочел что-то опрятное. – miki725

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