保存FileField时似乎不使用upload_to属性

时间:2013-06-04 19:20:06

标签: django media filefield

我无法将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

我错过了什么?

修改

我首先尝试设置一个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)

2 个答案:

答案 0 :(得分:1)

upload_to用于上传,您直接指定字符串名称。 upload_to仅在您创建FileField对象时执行操作(通过从表单上传)。

您可以阅读文档here

答案 1 :(得分:0)

upload_to是一个相对于项目根目录的目录,您上传的文件将被存储。但是你没有为它分配一个文件,你给它分配了一个字符串,这似乎导致你的FileField假设你的some_file.pdf中有一个名为MEDIA_ROOT的文件。

重复:指定文件名(字符串)使FileField忽略upload_to中定义的路径,并将给定的字符串作为真实路径。

祝你好运:)