Python 如何在Django模板中包含图像文件?

Python 如何在Django模板中包含图像文件?,python,django,django-templates,Python,Django,Django Templates,我是Django的新手,我正在尝试通过一个名为“dubliners”的简单项目和一个名为“book”的应用程序来学习它。目录结构如下所示: dubliners/book/ [includes models.py, views.py, etc.] dubliners/templates/book/ 我有一个JPG文件,需要显示在每个网页的标题。我应该把文件存放在哪里?我应该使用哪个路径让标记使用模板显示它?我尝试了不同的位置和路径,但到目前为止没有任何效果 谢谢你在下面贴出的答案。然而,我尝

我是Django的新手,我正在尝试通过一个名为“dubliners”的简单项目和一个名为“book”的应用程序来学习它。目录结构如下所示:

dubliners/book/  [includes models.py, views.py, etc.]
dubliners/templates/book/
我有一个JPG文件,需要显示在每个网页的标题。我应该把文件存放在哪里?我应该使用哪个路径让标记使用模板显示它?我尝试了不同的位置和路径,但到目前为止没有任何效果

谢谢你在下面贴出的答案。然而,我尝试了图像的相对路径和绝对路径,但仍然会在网页中显示一个损坏的图像图标。例如,如果我的主目录中有一个图像,并在模板中使用此标记:

<img src="/home/tony/london.jpg" /> 


图像不显示。但是,如果将网页保存为静态HTML文件,则会显示图像,因此路径是正确的。也许Django附带的默认Web服务器仅在图像位于特定路径时才会显示图像?

在生产环境中,您只需将模板生成的HTML指向主机存储媒体文件的位置即可。因此,您的模板将只包含一个示例

<img src="../media/foo.png">

然后,您只需确保目录中有相关的文件

在发展过程中是一个不同的问题。django文档对其进行了简洁明了的解释,这样链接到此处并在此处键入更为有效,但基本上您将为站点媒体定义一个视图,其中包含指向磁盘上位置的硬编码路径

对。

你的

<img src="/home/tony/london.jpg" />
在生产环境中,您希望跳过这一步,让您的http服务器(apache、lighttpd等)服务于静态文件

试试这个

设置.py
#通常是os.path.join(os.path.dirname(_文件,'media'))
媒体根=“/MEDIA”
媒体URL='/MEDIA/'
url.py
urlpatterns=patterns(“”,
(r'^media/(?P.*)$,'django.views.static.service',
{'document_root':settings.MEDIA_root}),
)
.html
/“/>
警告 注意!使用
Context()
将为
{{MEDIA\u URL}}
生成一个空值。必须改用
RequestContext()


我希望,这会有所帮助。

我花了整整两天的时间来研究这个问题,所以我想我也应该分享我的解决方案。从2010年11月26日起,当前的分支是1.2.X,这意味着您必须在settings.py中包含以下内容:

MEDIA_ROOT=“”(即/home/project/django/app/templates/static)
媒体URL=”http://localhost:8000/static/"
*(请记住,MEDIA_ROOT是文件所在的位置,MEDIA_URL是模板中使用的常量。)*

然后在url.py中放置以下内容:

import settings

# stuff

(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
导入设置
#东西
(r“^static/(?P.*)”,“django.views.static.service”,{'document_root':settings.MEDIA_root}),
然后,您可以在html中使用:

<img src="{{ MEDIA_URL }}foo.jpg">
<img class="scale-with-grid" src="{{object.photo.url}}"/>

django的工作方式(据我所知是:

  • 在html文件中,它用setting.py中的媒体URL路径替换媒体URL
  • 它在url.py中查找媒体url的任何匹配项,然后查找匹配项(如r“^static/(?P.)$”*与http://localhost:8000/static/)它在媒体根目录中搜索文件,然后加载它
  • 另一种方法是:

    MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/'
    MEDIA_URL = '/static/media/'
    
    这需要您将媒体文件夹移动到静态文件夹的子目录中

    然后,您可以在模板中使用:

    <img src="{{ MEDIA_URL }}foo.jpg">
    
    <img class="scale-with-grid" src="{{object.photo.url}}"/>
    

    我确实理解,您的问题是关于存储在MEDIA\u ROOT中的文件,但有时,当您不再计划创建该类型的内容时,可以将内容存储在静态中。
    这可能是一种罕见的情况,但无论如何——如果你的网站上有大量的“每日图片”——而所有这些文件都在你的硬盘上

    在这种情况下,我看不到以静态方式存储此类内容的矛盾。
    一切都变得非常简单:

    静止的 链接到保存在static_ROOT Django中的静态文件 随附静态模板标记。无论是否 您是否正在使用RequestContext

    {%load static%}


    复制自

    我尝试了各种方法,但都不起作用。但这起作用。希望它也能对您起作用。文件/目录必须位于以下位置:

    项目/你的应用程序/模板 项目/你的应用程序/静态

    设置.py 例如:

    STATIC_ROOT = '/home/project_name/your_app/static/'    
    STATIC_URL = '/static/'    
    STATICFILES_DIRS =(     
    PROJECT_DIR+'/static',    
    ##//don.t forget comma    
    )
    TEMPLATE_DIRS = (    
     PROJECT_DIR+'/templates/',    
    )
    
    proj/app/templates/filename.html 体内

    {% load staticfiles %}
    
    //for image
    
    img src="{% static "fb.png" %}" alt="image here"
    
    //note that fb.png is at /home/project/app/static/fb.png
    
    如果fb.png在/home/project/app/static/image/fb.png中,那么

    img src="{% static "images/fb.png" %}" alt="image here" 
    

    如果您的文件是模型中的模型字段,您还可以在模板标记中使用“.url”来获取图像

    比如说

    如果这是您的型号:

    class Foo(models.Model):
        foo = models.TextField()
        bar = models.FileField(upload_to="foo-pictures", blank = True)  
    
    在视图中的上下文中传递模型

    return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})
    
    在模板中,您可以有:

    <img src = "{{foo.bar.url}}">
    

    /项目根目录下的媒体目录

    设置.py url.py
    urlpatterns+=patterns('django.views.static',(r'^media/(?P.*),'serve',{'document_root':settings.media_root}),)
    
    模板
    正在开发中
    在应用程序文件夹中创建文件夹名称“static”,并将图片保存在该文件夹中。
    要使用图片,请使用:

    <html>
        <head>
           {% load staticfiles %} <!-- Prepare django to load static files -->
        </head>
        <body>
            <img src={% static "image.jpg" %}>
        </body>
    </html>
    
    
    {%load staticfiles%}
    
    正在生产中:
    一切都和开发中一样,只需为Django添加更多参数:

  • 外接程序设置.py
    STATIC\u ROOT=os.path.join(BASE\u DIR,“STATIC/”)
    (这将准备用于存储所有应用程序静态文件的文件夹)

  • 确保你的应用程序已安装在
    INSTALLED\u APPS=['myapp',]

  • 总而言之,所有运行命令python manage.py collectstatic(这将把安装的应用程序中包含的所有应用程序的静态文件复制到全局静态文件夹-静态根文件夹)

    这就是Django所需要的,在此之后,您需要进行一些web服务器端设置,以便为使用静态文件夹做好准备
    class Foo(models.Model):
        foo = models.TextField()
        bar = models.FileField(upload_to="foo-pictures", blank = True)  
    
    return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})
    
    <img src = "{{foo.bar.url}}">
    
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
        urlpatterns += patterns('django.views.static',(r'^media/(?P<path>.*)','serve',{'document_root':settings.MEDIA_ROOT}), )
    
    <img src="{{MEDIA_URL}}/image.png" > 
    
    <html>
        <head>
           {% load staticfiles %} <!-- Prepare django to load static files -->
        </head>
        <body>
            <img src={% static "image.jpg" %}>
        </body>
    </html>