如何在Django中显示来自ImageField的图像?

时间:2015-09-08 16:45:45

标签: django django-models django-templates

在我解释之前,我有一个问题。我正在制作博客,帖子有标题图片。当我为我的博客创建帖子时,我使用管理员上传此图片。此图片是“静态”还是“媒体”?

无论如何,我的项目设置如下: mysite是我的项目,博客是我的应用程序。我在博客中有一个名为static的文件夹。在这个静态文件夹中还有四个文件夹 - css,图像,字体,js。

在settings.py中,我设置了这个:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

我的models.py看起来像这样:

class Post(models.Model):
    ...
    header_image = models.ImageField('article_header_image', upload_to = 'blog/static/images/articleimages')

现在,当我尝试在模板中加载此图片时,它不会显示。

我这样做的方式如下:

{% for post in posts %}
<img src="{{post.header_image.url}}"> 
{% endfor %}

另一件事,我如何使用upload_to参数将图像上传到应用程序的静态文件夹而不明确说明它?我认为这就是问题所在。如果我使用upload_to ='static / images / articleimages',则会在包含manage.py的mysite文件夹中创建一个新的静态文件夹。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以从设置文件中导入STATIC_ROOT,然后使用它来生成路径。除此之外,您可以使用可调用的,并在那里构建路径:

import os.path
from django.conf import settings

def generate_upload_path(instance, filename):
    return os.path.join(settings.STATIC_ROOT, 'images/articleimages/')

class Post(models.Model):
    ...
    header_image = models.ImageField('article_header_image', upload_to = generate_upload_path)

好的,如果您要将图片上传到应用的static目录,可以使用应用的__path__属性:

import blog

def generate_upload_path(instance, filename):
    return os.path.join(blog.__path__, 'static/images/articleimages/')