为什么file.url返回与django中的file.path相同的值?

时间:2013-06-19 16:11:38

标签: python django models filefield

我正处在一个非常奇怪的问题中间。

我有一个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/'

我错过了什么吗? 有什么建议吗?

提前谢谢。

2 个答案:

答案 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参数中的尾部斜杠。

总结

  1. 检查上传文件夹是否存在;
  2. 设置单独的静态和媒体路径和网址;
  3. 从您的默认值中删除格式字符串;和
  4. upload_to参数
  5. 中删除尾部斜杠

    你应该有工作代码。