Django 模板迭代和渲染函数返回的列表中的项目
Posted
技术标签:
【中文标题】Django 模板迭代和渲染函数返回的列表中的项目【英文标题】:Django Templates Iterate & render items in the list returned by a function 【发布时间】:2013-09-05 21:43:35 【问题描述】:如何渲染模板中函数get_image返回的列表dd = []中的项目?该列表包含函数返回的文件列表。
只是想添加 index.html 在 project_folder/inc/html 下,其中图像在 project_folder/inc/img & settings 下,views & url 在 project_folder 下
index.html
<ul>
% for object in dd %
<li><img src="views.img_dir% views.img_dir.object.get_absolute_url %"></li>
<li><img src="views.img_dir% views.img_dir.dd.get_absolute_url %"></li>
% endfor %
</ul>
如果我试试这个:
<ul>
% for object in dd %
<li><img src="settings.img_dir object.get_absolute_url"></li>
<li><img src="settings.img_dir %object%"></li>
% endfor %
</ul>
我收到一个 TemplateSyntaxError 无法解析剩余部分:来自 '%object%' 的 '%object%'
views.py
SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
img_dir = os.path.join(SETTINGS_PATH, "inc/img/")
def get_image(request):
for file in os.listdir(img_dir):
h = []
h.append(file)
for l in h:
r = l.endswith('.jpg') or l.endswith('.png') or l.endswith('.gif')
if r == True:
dd = []
dd.append(l)
return render_to_response('index.html', dd)
url.py
urlpatterns = patterns('',
url(r'^$', get_image),
settings.py
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
TEMPLATE_DIRS = (
os.path.join(PROJECT_ROOT, "inc/html"),
)
【问题讨论】:
hmm,尝试了 index.html 加载,但图像未呈现 :( 有什么想法吗? 【参考方案1】:您的模板语法错误。
你不能使用 %variable%
,它要么是 variable
要么是% function %
<li><img src="settings.img_dir %object%"></li>
应该是
<li><img src="settings.img_dir object "></li>
您提供的第一个块也有多个错误
% for object in dd %
<li><img src="views.img_dir% views.img_dir.object.get_absolute_url %"></li>
<li><img src="views.img_dir% views.img_dir.dd.get_absolute_url %"></li>
% endfor %
% varible %
什么是views.img_dir
?你已经在你的
views.py
我假设,但它永远不会传递给模板。因此你将无法做到views.img_dir
。 (除非你做了一些超级魔法,否则你不会向我们展示)
这会导致views.img_dir.object
无法渲染。
最后,views.img_dir.object
将永远无法工作(假设您已将对象传递给模板),因为它是一个字符串,而字符串永远不会有属性 object
形成您的 for 循环。
如您所见,您的代码中有多个错误,您将永远无法使用这些错误来渲染图像。
【讨论】:
试过了,index.html 加载了,但是图片没有呈现在页面上。 那么我该如何渲染它们呢?由于列表确实从目录中获取文件列表,因此我正在尝试通过函数渲染模板中的所有图像。 您是否遵循过如何在 Django 中渲染图像的教程,因为,鉴于您目前所做的工作,它似乎对您最有利 我确实检查了一些链接和谷歌,但他们中的大多数都返回了在 setting.py 中确认媒体和 static_files 目录...&我正在尝试通过一个函数来呈现它,我只是不明白为什么它失败了 重点是您需要了解静态文件的概念以及如何使用 Django 来提供它。 Django 有一套提供服务的方式,你不能随意地从任意目录中提供文件。我建议您将要渲染的图像目录添加到静态文件目录中,然后像这样渲染它 STATIC_FILES/img/my_image.jpg
【参考方案2】:
我确实将我的模板从 django 更改为 Jinja2:并且通过对我的功能稍作更改,我能够渲染模板上的所有图像。
JINJA2 模板
函数如下:
SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
img_dir = os.path.join(SETTINGS_PATH, "inc/img")
class ImageHandler(webapp2.RequestHandler):
def get(self):
images = os.listdir(img_dir)
template = jinja.get_template('image.html')
template_values = 'images': images
self.response.write(template.render(template_values))
HTML:
<ul>
% for img in images %
<li><img src="/img/ img|e "></li>
% endfor %
</ul>
我也得到了一个 sn-p 来渲染 Django 中的所有图像,但我改变了我的模板系统。
如果有人需要在 Django 上获取它,这里是 sn-p:
VIEWS.PY
def index(request):
"""Renders the index for the site."""
images = os.listdir(templates)
images.sort()
for i in xrange(len(images)):
name = name_for_image(images[i])
images[i] = (name, images[i])
return shortcuts.render_to_response('index.html',
'images': images,,
template.RequestContext(request))
index.html
% for name, image in images %
<td>
<a href="% url caption fn=image %">
<img src="% url thumbnail fn=image %"/><br/> name
</a>
</td>
% if forloop.counter|divisibleby:5 %</tr><tr>% endif %
% endfor %
注意:上面的 Django 代码需要一些调整,因为它还依赖另一个名为 def name_for_image(image):
的函数,该函数使用 img src 呈现图像的名称。
【讨论】:
以上是关于Django 模板迭代和渲染函数返回的列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章