1

我在这里遇到了一个非常奇怪的问题。

我在声明如下的模型中有一个具有默认值的 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/'

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

先感谢您。

4

2 回答 2

3

您需要在字段的默认值中指定要保存在数据库中的实际值(字符串) ,而不是完整路径。这就是为什么以.url这种方式出现的原因。你的情况应该是这样的:

audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False)

default请注意,我只是认为在将插入数据库时​​您会遇到这个问题。

希望这可以帮助!

于 2013-06-19T16:30:46.453 回答
2

有几件事我认为你不需要,这可能会也可能不会导致问题。我有以下代码在生产中完美运行(Django 1.5)。模型.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。我认为您不应该在默认值中包含格式字符串(请参阅 Paulo Bu 的回答)或在参数% settings.MEDIA_ROOT中使用尾部斜杠。upload_to

总之

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

你应该有工作代码。

于 2013-06-19T16:30:13.507 回答