在Django模板中显示图片

18 投票
4 回答
53430 浏览
提问于 2025-04-17 17:41

有人能帮我解决这个问题吗:我有一个Django项目,

在settings.py文件中

 MEDIA_ROOT = 'C:/Users/hl/workspace/beer/media'
 MEDIA_URL = '/media/'
 STATICFILES_DIRS = (
    'C:/Users/hl/workspace/beer/media'
 )

在models.py文件中

image1= models.ImageField(upload_to=settings.MEDIA_ROOT)

在url.py文件中

 (r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),

在views文件中

def allBeer(request): 
      beers=Beer.objects.all().order_by("name")
      context={'beers': beers}
      return render_to_response('AllBeers.html',context,context_instance=RequestContext(request))

在html文件中

 {%for beer in beers %}
    <p>
        <a href="/beers/{{beer.slug}}/">
            <img scr="{{beer.image1.url}}">{{beer}}
        </a>
    </p>
 {% endfor%}

我加载图片没有问题,但图片在html文件中就是不显示。我在网上查了很多资料,但还是搞不明白。

有人能告诉我这是为什么吗?

4 个回答

7

按照以下步骤在你的Django模板中加载图片:

  1. 在你的设置文件中添加以下内容:
    
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
  1. 在你的项目根目录下创建一个名为“media”的文件夹,也就是说,这个文件夹要和你的应用程序在同一个层级。

  2. 在你的主urls.py文件中添加以下内容:

from . import views, settings
from django.contrib.staticfiles.urls import static

urlpatterns = [
    # ... the rest of your path goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  1. 在你的模型中,使用ImageField来定义用于存放图片的字段。
    
photo = models.ImageField(upload_to="gallery")
  1. 在你的模板中添加以下内容来加载图片:

如果你是从上下文对象动态加载图片,可以使用类似这样的语法:

    
img src="{{ obj1.photo.url }}"

如果你是静态加载,也就是文件名已经确定了,可以使用:

img src="/media/project_name/photo.png"
8

你在搞乱图片的 src 属性。它应该是这样的 -

<img src="{{beer.image1.url}}" /> <!-- from the media url -->

不要在后面加任何东西 - django 知道从哪个网址提供图片 - 这就是模型中的 ImageField 的作用。

我不确定你的网址配置有没有问题,但在 文档 中推荐的模式是 -

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
11
image1= models.ImageField(upload_to=images)


from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from project_name import settings

admin.autodiscover()
urlpatterns = patterns('',
    ...........
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()


<img src="{{MEDIA_URL}}{{beer.image1}}">

settings.py 是一个配置文件

import os

PROJECT_ROOT = os.path.join(os.path.dirname(__file__), '..')
SITE_ROOT = PROJECT_ROOT


MEDIA_ROOT = os.path.join(SITE_ROOT, 'media')
MEDIA_URL = '/media/'


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


STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    os.path.join(SITE_ROOT, 'staticfiles'),
)

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, 'templates'),
)

撰写回答