Django FileField upload_to帮助

时间:2016-10-24 16:30:41

标签: python django

我是python的新手,并试图适应Python的OOP。有人可以解释为什么以下保存在名为“无”的文件夹中?我想在管理页面上传一个音频文件。该文件以“Vocab name”

存储在自己的文件夹中
class Vocab(models.Model):
module = models.ForeignKey(Modules, on_delete=models.CASCADE)
number = models.CharField(max_length = 250)
name = models.CharField(max_length = 250)

class VocabContent(models.Model):
vocab = models.ForeignKey(Vocab, on_delete=models.CASCADE)
audio = models.FileField(upload_to=vocab.name)

在shell上运行以下命令。

>>> from module.models import Modules, Vocab, VocabContent
>>> vocab = VocabContent.objects.get(pk=1)   
>>> vocab.vocab.name
'Numbers'

数字是我正在寻找的价值。

1 个答案:

答案 0 :(得分:1)

可能是因为在运行模型迁移时未定义引用vocab.name的方式。我无法准确解释为什么会发生这种情况,但解决方案是使用callable作为upload_to在运行时对其进行评估并正确获取值,就像其他答案一样:Dynamic File Path in Django

所以,对你而言,你可以拥有类似的东西:

import os
def get_upload_path(instance, filename):
    return os.path.join("%s" % instance.vocab.name, filename)


class VocabContent(models.Model):
    vocab = models.ForeignKey(Vocab, on_delete=models.CASCADE)
    audio = models.FileField(upload_to=get_upload_path)  # Important to NOT put the parenthesis after the function name

这将导致将vocab.name连接到每个新文件的文件名的路径。