我正处在一个非常奇怪的问题中间。
我有一个FileField,在声明如下的模型中有一个默认值:
class MyModel(models.Model):
name = models.CharField(max_length=32)
audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_ROOT, blank=True, null=False)
现在,当我执行以下操作时
>>> a = MyModel(name='Foo')
>>> a.save()
>>> a.audio_file.path
'/full/path/to/file'
>>> a.audio_file.url
'/full/path/to/file' # again
我的MEDIA_ROOT和MEDIA_URL配置如下
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'static/')
MEDIA_URL = '/media/'
我错过了什么吗? 有什么建议吗?
提前谢谢。
答案 0 :(得分:3)
您需要在字段中指定要保存在数据库中的实际值(字符串)的默认值,而不是完整路径。这就是.url
以这种方式出现的原因。对于你的情况应该是这样的:
audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False)
请注意,我只是认为在数据库中插入default
时会出现此问题。
希望这有帮助!
答案 1 :(得分:2)
有一些我认为你不需要的东西,可能会或可能不会导致问题。我有以下代码在生产中完美运行(Django 1.5)。 models.py:
...
decision_file = models.FileField(
upload_to = "guidance",
blank = True,
help_text = "20MB maximum file size."
)
...
在我的基本settings.py中:
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), '../../media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(os.path.dirname(__file__), '../../static/')
STATIC_URL = '/static/'
注意我正在为静态和媒体文件定义单独的路径和URL。我不认为您应该在默认情况下包含% settings.MEDIA_ROOT
的格式字符串(请参阅Paulo Bu的答案)或使用upload_to
参数中的尾部斜杠。
总结
upload_to
参数你应该有工作代码。