【问题标题】:Displaying static image in Django model在 Django 模型中显示静态图像
【发布时间】: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")

提前感谢您的所有帮助!

【问题讨论】:

    标签: django django-models django-templates django-staticfiles django-settings


    【解决方案1】:

    您需要检查的几件事:

    1. 您是否在 settings.py 文件中设置了 MEDIA_ROOT 和 MEDIA_URL?

    2. 您指定了一个 upload_to:

      upload_to='user/profile_pictures/'
      

      此路径是否在 MEDIA_ROOT 路径下? (即可以被 Django 发现)

    3. 您必须通过在 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/

    4. 在生产中,您应该让 Apache 或 nginx 来服务器静态图像。步骤2中推荐的方法仅用于开发和测试目的。

    5. 如果您已完成上述所有步骤,但仍然无法正常工作,请在呈现的网页中找到指向个人资料图片的链接,将其复制并粘贴到浏览器窗口中,看看会出现什么样的错误.

    【讨论】:

    • 谢谢你,但我指的是STATIC_URL下的默认图像,而不是MEDIA_URL。这就是为什么我没有包括我的媒体配置 - 这与这个问题无关。我还想直接从模型中显示图像,而不是从渲染的网页中显示。
    • @jape 无论您是从 MEDIA 目录还是 STATIC 目录加载图像,实现这一点的步骤都是相同的。 1. Django 必须能够发现图像。 2. Django 或您选择的任何服务器都必须为这些图像提供服务。由于您的默认配置文件图像是静态的,因此无需将其加载到您的模型中。您可以编写 if..else 来检查当前用户是否有个人资料图像。他/她有它,很好地加载它。如果没有,只需链接到默认图像,就像在模板中加载 css 文件一样。
    猜你喜欢
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2017-04-04
    • 2021-06-24
    • 2022-11-30
    • 2017-04-14
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多