Ton*_*ony 65 python django django-templates
我是Django的新手,我正在尝试通过一个名为'dubliners'的简单项目和一个名为'book'的应用程序来学习它.目录结构如下:
dubliners/book/ [includes models.py, views.py, etc.]
dubliners/templates/book/
Run Code Online (Sandbox Code Playgroud)
我有一个JPG文件需要显示在每个网页的标题中.我应该在哪里存储文件?我应该使用哪条路径让标签使用模板显示它?我尝试过各种各样的地点和路径,但到目前为止还没有任何工作.
...
感谢下面的答案.但是,我已经尝试了图像的相对和绝对路径,并且我仍然在网页中显示一个损坏的图像图标.例如,如果我的主目录中有图像并在我的模板中使用此标记:
<img src="/home/tony/london.jpg" />
Run Code Online (Sandbox Code Playgroud)
图像不显示.但是,如果我将网页保存为静态HTML文件,则会显示图像,因此路径正确.也许Django附带的默认Web服务器只有在特定路径上才会显示图像?
小智 66
试试这个,
# typically, os.path.join(os.path.dirname(__file__), 'media')
MEDIA_ROOT = '<your_path>/media'
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
urlpatterns = patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
Run Code Online (Sandbox Code Playgroud)
<img src="{{ MEDIA_URL }}<sub-dir-under-media-if-any>/<image-name.ext>" />
Run Code Online (Sandbox Code Playgroud)
谨防!使用Context()将产生一个空值{{MEDIA_URL}}.你必须使用RequestContext().
我希望这个能帮上忙.
Jos*_*sad 35
在生产中,您只需从模板生成的HTML指向主机存储媒体文件的位置.所以你的模板就是这样的
<img src="../media/foo.png">
Run Code Online (Sandbox Code Playgroud)
然后你只需要确保该目录与相关文件一起存在.
在开发期间是一个不同的问题.django文档简洁明了地解释了它在链接并在此处键入它更有效,但基本上你将为站点媒体定义一个视图,其中包含硬盘编码的磁盘位置路径.
右键点击这里.
And*_*yak 18
我的理解是,您的问题是关于存储在MEDIA_ROOT中的文件,但是当您不打算再创建该类型的内容时,有时可以将内容存储在静态中.
可能这是一个罕见的情况,但无论如何 - 如果你的网站有大量"当天的图片" - 所有这些文件都在你的硬盘上?
在这种情况下,我认为没有反对将这样的内容存储在STATIC中.
一切都变得非常简单:
静态的
链接到STATIC_ROOT中保存的静态文件Django附带静态模板标记.无论您是否使用RequestContext,都可以使用此方法.
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
小智 11
我花了两天时间研究这个问题,所以我想我也会分享我的解决方案.截至2010年11月26日,当前分支为1.2.X,这意味着您必须在settings.py中拥有以下内容:
MEDIA_ROOT = "<path_to_files>" (i.e. /home/project/django/app/templates/static)
MEDIA_URL = "http://localhost:8000/static/"
Run Code Online (Sandbox Code Playgroud)
*(请记住,MEDIA_ROOT是文件的位置,MEDIA_URL是您在模板中使用的常量.)*
然后在你的url.py中放置以下内容:
import settings
# stuff
(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
Run Code Online (Sandbox Code Playgroud)
然后在你的HTML中你可以使用:
<img src="{{ MEDIA_URL }}foo.jpg">
Run Code Online (Sandbox Code Playgroud)
django的工作方式(据我所知):
小智 9
项目根目录下的/ media目录
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Run Code Online (Sandbox Code Playgroud)
urlpatterns += patterns('django.views.static',(r'^media/(?P<path>.*)','serve',{'document_root':settings.MEDIA_ROOT}), )
Run Code Online (Sandbox Code Playgroud)
<img src="{{MEDIA_URL}}/image.png" >
Run Code Online (Sandbox Code Playgroud)
在开发中
在您的app文件夹中创建文件夹名称'static'并将图片保存在该文件夹中.
要使用图片:
<html>
<head>
{% load staticfiles %} <!-- Prepare django to load static files -->
</head>
<body>
<img src={% static "image.jpg" %}>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在生产中:
与开发中的一样相同,只需为Django添加更多参数:
添加settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static/")(这将准备文件夹,其中将存储来自所有应用程序的静态文件)
确保你的应用程序在 INSTALLED_APPS = ['myapp',]
在terminall运行命令python manage.py collectstatic(这将使包含在INSTALLED_APPS中的所有应用程序的静态文件复制到全局静态文件夹--STATIC_ROOT文件夹)
这就是Django需要的所有内容,之后您需要进行一些Web服务器端设置使用静态文件夹的提交.例如,在配置文件httpd.conf(对于windows)或sites-enabled/000-default.conf中的apache2中.(在linux的站点虚拟主机部分下)添加:
别名\ static"path_to_your_project\static"
要求所有被授予的
就是全部
小智 6
如果您的文件是模型中的模型字段,您还可以在模板标记中使用".url"来获取图像.
例如.
如果这是你的型号:
class Foo(models.Model):
foo = models.TextField()
bar = models.FileField(upload_to="foo-pictures", blank = True)
Run Code Online (Sandbox Code Playgroud)
在视图中将模型传递给上下文.
return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})
Run Code Online (Sandbox Code Playgroud)
在您的模板中,您可以:
<img src = "{{foo.bar.url}}">
Run Code Online (Sandbox Code Playgroud)
您的
<img src="/home/tony/london.jpg" />
Run Code Online (Sandbox Code Playgroud)
将用于从磁盘读取的HTML文件,因为它将假定URL file:///home/....对于从网络服务器提供的文件,URL将变为:http://www.yourdomain.com/home/tony/london.jpg,这可能是无效的URL而不是您的真实含义.
有关如何提供服务以及放置静态文件的位置,请查看此文档.基本上,如果您正在使用django的开发服务器,您希望向他显示您的媒体文件所在的位置,然后将您的urls.py服务提供给那些文件(例如,使用一些/static/网址前缀).
将要求你在你的东西中放置这样的东西urls.py:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
Run Code Online (Sandbox Code Playgroud)
在生产环境中,您希望跳过此操作并使您的http服务器(apache,lighttpd等)提供静态文件.