Python 为什么file.url返回的值与django中的file.path相同? 我在这里遇到了一个非常奇怪的问题。

Python 为什么file.url返回的值与django中的file.path相同? 我在这里遇到了一个非常奇怪的问题。,python,django,models,filefield,Python,Django,Models,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) 现在,当我执行以下操作

我在模型中有一个具有默认值的文件字段,声明如下:

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
我的媒体根目录和媒体URL配置如下

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'static/')
MEDIA_URL = '/media/'
我错过什么了吗? 有什么建议吗


提前谢谢。

有几件事我认为您不需要,这可能是问题的原因,也可能不是问题的原因。我有以下代码在Django 1.5的生产环境中完美地工作。models.py:

...
    decision_file = models.FileField(
        upload_to = "guidance",
        blank = True,
        help_text = "20MB maximum file size."
    )
...
在my base 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\u ROOT的格式字符串。请参阅Paulo Bu的答案,或者在upload\u to参数中使用尾部斜杠

总之

检查上传文件夹是否存在; 设置单独的静态和媒体路径和URL; 从文件中删除格式字符串;和 从upload_to参数中删除尾部斜杠
您应该有工作代码。

我认为您不需要一些东西,这些东西可能是问题的原因,也可能不是问题的原因。我有以下代码在Django 1.5的生产环境中完美地工作。models.py:

...
    decision_file = models.FileField(
        upload_to = "guidance",
        blank = True,
        help_text = "20MB maximum file size."
    )
...
在my base 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\u ROOT的格式字符串。请参阅Paulo Bu的答案,或者在upload\u to参数中使用尾部斜杠

总之

检查上传文件夹是否存在; 设置单独的静态和媒体路径和URL; 从文件中删除格式字符串;和 从upload_to参数中删除尾部斜杠
您应该有工作代码。

您需要在字段的默认值中指定要保存在数据库中的实际值字符串,而不是完整路径。这就是.url以这种方式显示的原因。对于您的案例,应如下所示:

audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False)
请注意,我认为在数据库中插入默认值时,您会遇到这个问题


希望这有帮助

您需要在字段的默认值中指定要保存在数据库中的实际值字符串,而不是完整路径。这就是.url以这种方式显示的原因。对于您的案例,应如下所示:

audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False)
请注意,我认为在数据库中插入默认值时,您会遇到这个问题


希望这有帮助

您可以在模板中看到不同之处,在模板中,它将url域置于前面。这就是区别:您可以在模板中看到区别,在模板中,它将url域置于前面。这就是区别:谢谢你,我试着这样做,结果发现可疑的操作错误。:-。玩一点斜杠,试着上传到用户菜单。有时会发生这种情况。此外,我还编辑了我的答案,而不是硬连接/media路径,我采用了您的方式,但使用media\u URL而不是media\u ROOT。我将默认值更改为:default=user\u menus/defaul.mp3,解决了问题。非常感谢。谢谢。我试着用这种方式做,但发现了可疑的操作错误。:-。玩一点斜杠,试着上传到用户菜单。有时会发生这种情况。此外,我还编辑了我的答案,而不是硬连接/media路径,我采用了您的方式,但使用media\u URL而不是media\u ROOT。我将默认值更改为:default=user\u menus/defaul.mp3,解决了问题。非常感谢你