在 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 模型中显示静态图像的主要内容,如果未能解决你的问题,请参考以下文章

Django显示静态文件夹之外的图像/视频

Django - 部署后只有一些静态图像没有显示在网页上

django 加载静态图片失败

调试模式打开时的 Django 和静态文件

在静态文件中加载图像

不允许在/空静态前缀处配置不当 - Django