2013-06-04 2 views
2

Я не могу установить url FileField, который я хочу.атрибут upload_to, кажется, не используется при сохранении FileField

Моя модель определяется

class MyModel(models.Model): 

    pdf_file = models.FileField(upload_to="reports", null=True, blank=True) 
    # more stuff 

и создать экземпляр с помощью:

myModel = MyModel() 
myModel.pdf_file = "some_file.pdf" 
myModel.save() 

myModel.pdf_file.url возвращается <MEDIA_URL>/some_file.pdf, в то время как я хотел бы ожидать, что это будет <MEDIA_URL>/reports/some_file.pdf, из-за атрибута upload_to.

Что мне не хватает?

EDIT

я впервые попробовал установить File объект вместо string но он дублирует мой файл с _<duplication_num> приложенными к ней, поэтому я сначала создать свой файл в папке TMP и удалить его:

myModel.pdf_file = File(open(TMP_FILE_PATH + filename)) 
myModel.save() 

# now that the file is saved to its final location, delete tmp 

filepath = os.path.abspath(TMP_FILE_PATH + filename) 
os.remove(filepath) 

ответ

1

upload_to используется для загрузки, Вы присваивая имя строки непосредственно. upload_to принимает действие только при создании объекта FileField (путем загрузки из формы).

Вы можете прочитать документацию here

0

upload_to является каталогом относительно вашего корня проекта, где файлы вы загружаете предназначены для хранения. Но вы не присваиваете ему файл, вы назначаете ему строку, которая, кажется, заставляет ваш FileField предположить, что в вашем MEDIA_ROOT есть файл с именем some_file.pdf.

Repeat: присвоение имени файла (строки) делает FileField игнорировать путь, определенный в upload_to и принимает заданную строку в качестве реального пути.

Удача :)

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