在 Django 模型中显示静态图像
Posted
技术标签:
【中文标题】在 Django 模型中显示静态图像【英文标题】:Displaying static image in Django model 【发布时间】:2015-07-17 09:17:48 【问题描述】:如果用户有个人资料图片,我想显示它。如果他/她没有个人资料图片,我想在其位置显示默认图片。
有没有办法在 Django 模型属性中加载静态图像?
注意:用户的个人资料图片使用以下代码加载。包含默认图像的else
语句不起作用。
这是我目前所拥有的:
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
profile_picture = models.ImageField(upload_to='user/profile_pictures/',
null=False,
blank=False)
@property
def default_profile_picture(self):
if self.profile_picture:
return "%s/%s" %(settings.MEDIA_URL, self.profile_picture)
else:
return settings.STATIC_URL + 'img/default_profile_picture.jpg'
settings.py:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(os.path.dirname(BASE_DIR), "static", "static_dirs"),
)
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static", "static_root")
提前感谢您的所有帮助!
【问题讨论】:
【参考方案1】:您需要检查的几件事:
您是否在 settings.py 文件中设置了 MEDIA_ROOT 和 MEDIA_URL?
您指定了一个 upload_to:
upload_to='user/profile_pictures/'
此路径是否在 MEDIA_ROOT 路径下? (即可以被 Django 发现)
您必须通过在 urls.py 文件中添加以下行来告诉 Django 提供静态文件:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
以上代码适用于 Django 1.8。对于您的 django 版本,请阅读此处的文档:https://docs.djangoproject.com/en/1.8/howto/static-files/
在生产中,您应该让 Apache 或 nginx 来服务器静态图像。步骤2中推荐的方法仅用于开发和测试目的。
如果您已完成上述所有步骤,但仍然无法正常工作,请在呈现的网页中找到指向个人资料图片的链接,将其复制并粘贴到浏览器窗口中,看看会出现什么样的错误.
【讨论】:
谢谢你,但我指的是STATIC_URL
下的默认图像,而不是MEDIA_URL
。这就是为什么我没有包括我的媒体配置 - 这与这个问题无关。我还想直接从模型中显示图像,而不是从渲染的网页中显示。
@jape 无论您是从 MEDIA 目录还是 STATIC 目录加载图像,实现这一点的步骤都是相同的。 1. Django 必须能够发现图像。 2. Django 或您选择的任何服务器都必须为这些图像提供服务。由于您的默认配置文件图像是静态的,因此无需将其加载到您的模型中。您可以编写 if..else 来检查当前用户是否有个人资料图像。他/她有它,很好地加载它。如果没有,只需链接到默认图像,就像在模板中加载 css 文件一样。以上是关于在 Django 模型中显示静态图像的主要内容,如果未能解决你的问题,请参考以下文章