我有一个包含user_image字段的模型。该字段具有默认图像值:
user_image = models.ImageField(verbose_name='Аватар',blank=True, default=settings.STATIC_URL+'avatar.jpeg')
更新到django 1.10后,此默认图像不会显示在模板中,因为链接包含错误的路径。例如,在我的情况下,链接应该是
'127.0.0.0:8000/static/avatar.jpeg'
相反,我有像这样的链接
'127.0.0.0:8000/media/static/avatar.jpeg'
Python控制台输出
>>>u.userprofiletable_set.get().user_image
<ImageFieldFile: /static/avatar.jpeg>
>>> u.userprofiletable_set.get().user_image.url
'/media/static/avatar.jpeg'
>>> u.userprofiletable_set.get().user_image.path
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Users/korablevop/.virtualenvs/mynewenv/lib/python3.5/site-packages/django/db/models/fields/files.py", line 64, in _get_path
return self.storage.path(self.name)
File "/Users/korablevop/.virtualenvs/mynewenv/lib/python3.5/site-packages/django/core/files/storage.py", line 407, in path
return safe_join(self.location, name)
File "/Users/korablevop/.virtualenvs/mynewenv/lib/python3.5/site-packages/django/utils/_os.py", line 78, in safe_join
'component ({})'.format(final_path, base_path))
django.core.exceptions.SuspiciousFileOperation: The joined path (/static/avatar.jpeg) is located outside of the base path component (/Users/korablevop/PycharmProjects/sxodu/media)
答案 0 :(得分:0)
在user_image
的定义中,您有以下内容:
default=settings.STATIC_URL+'avatar.jpeg'
这没有任何意义。首先,STATIC_URL
是一个URL,而不是文件系统路径,在这里您将它用作文件系统路径。其次,不要混淆静态和媒体文件。 user_image
是媒体,而非静态。
Django创建了链接127.0.0.0:8000/media/static/avatar.jpeg
,因为根据上述内容,您的user_image
是/static/avatar.jpeg
。它将其与MEDIA_URL
连接起来,因此它变为/media//static/avatar.jpg
。也许它通过删除双斜杠来规范化URL,但问题是,你完全错了。
您可能会发现我的帖子How Django static files work in production,很有帮助。