Django模板迭代&渲染函数返回的列表中的项目

时间:2013-09-02 18:31:17

标签: django python-2.7 django-templates django-views

如何渲染列表中的项目dd = []从模板中的函数get_image返回?该列表包含函数返回的文件列表。

只是喜欢添加index.html在project_folder / inc / html下,其中的图像位于project_folder / inc / img&设置,视图和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"),
)

2 个答案:

答案 0 :(得分: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 %}
  1. {{% varible %}}
  2. 什么是views.img_dir?你已经在你的中定义了它 views.py我假设,但它永远不会传递给模板。因此,您将无法views.img_dir。 (除非你做过一些超级魔法,否则你没有向我们展示)
  3. 导致views.img_dir.object无法呈现。
  4. 最后,views.img_dir.object将永远无法工作(假设您已将对象传递给模板),因为它是一个字符串,并且字符串永远不会形成属性object形成for循环。
  5. 正如您所看到的,您的代码中存在多个错误,您将无法使用该错误渲染图像。

答案 1 :(得分:0)

我确实改变了从django到Jinja2的模板:&amp;在我的功能中进行了小小的改变,我能够在模板上渲染所有图像。

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>

我还得到一个片段来渲染Django中的所有图像,但我改变了我的模板系统。

如果有人需要在Django上获取它,那么这里是片段:

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呈现图像的名称。