【问题标题】:Django template for loop用于循环的 Django 模板
【发布时间】:2013-08-31 12:39:55
【问题描述】:

我有一个模板,我可以在其中获取某些变量。 一个变量是 instance.category,它输出:“words words words”,它是由空格分隔的值。

当我使用下面的代码时,我会逐个字母地返回而不是单词。

{% for icon in instance.category  %}
  <p>{{ icon }}</p>
{% endfor %}

输出

<p>w</p>
<p>o</p>
<p>r</p>
<p>d</p>
<p>w</p>
....

我需要:

<p>word</p>
<p>word</p>
<p>word</p>

Django 插件代码

from cmsplugin_filer_image.cms_plugins import FilerImagePlugin
from cms.plugin_pool import plugin_pool
from django.utils.translation import ugettext_lazy as _
from models import Item

class PortfolioItemPlugin(FilerImagePlugin):
    model = Item
    name = "Portfolio item"
    render_template = "portfolio/item.html"
    fieldsets = (
        (None, {
            'fields': ('title', 'category',)
        }),
        (None, {
            'fields': (('image', 'image_url',), 'alt_text',)
        }),
        (_('Image resizing options'), {
            'fields': (
                'use_original_image',
                ('width', 'height', 'crop', 'upscale'),
                'use_autoscale',
            )
        }),
        (_('More'), {
            'classes': ('collapse',),
            'fields': (('free_link', 'page_link', 'file_link', 'original_link', 'target_blank'),)
        }),
    )

plugin_pool.register_plugin(PortfolioItemPlugin)

感谢任何帮助!

【问题讨论】:

  • 你能给我们看一下类别的视图吗?
  • 我们重写了 FilerImage 插件,为投资组合项目添加了一个额外的字段。这对你有帮助吗(更新)?

标签: python html django django-templates


【解决方案1】:

我知道这是一个迟到的答案,但它可能会帮助某人(这是我遇到的问题)。 如果您在表格中有一个点:(x,y)。那么你需要:

{% for x, y in points %}
    There is a point at {{ x }},{{ y }}
{% endfor %}

对于键值对:

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

来源:here(查看 for 部分)

【讨论】:

    【解决方案2】:

    您正在将字符串 instance.category 传递到模板中,然后遍历其字符。

    相反,将列表传递给模板:instance.category.split(),这会将您的 words words words 字符串拆分为列表 ['words', 'words', 'words']

    >>> s = "words words words"
    >>> s.split()
    ['words', 'words', 'words']
    

    或者,您可以定义一个custom filter,它将一个字符串拆分到列表中:

    from django import template
    register = template.Library()
    
    @register.filter
    def split(s, splitter=" "):
        return s.split(splitter)
    

    然后,在模板中这样使用:

    {% for icon in instance.category|split %}
        <p>{{ icon }}</p>
    {% endfor %}
    

    【讨论】:

    • 我正在使用自定义过滤器,但出现此错误:'for' 语句应使用格式 'for x in y': for icon in instance.category|split:" " 有什么想法吗?
    • 我用@Augusto Men 的上述评论修复了它,无论如何,谢谢,赞成。
    • 为了更简洁,我已经删除了无用的{% with %}
    • @MaximeLorant 是的,它最初没有with,然后我试图以这种方式解决 OP 的问题。
    • @NielsenRamon 正如 Augusto Men 正确指出的那样:您不需要自定义过滤器,以防您总是按空间分割。顺便说一句,我已经更新了答案 - 也应该适用于你的情况。
    【解决方案3】:

    如果您的分隔符始终是 " " 并且 category 是一个字符串,那么您实际上不需要自定义模板过滤器。你可以简单地调用split,不带参数:

    {% for icon in instance.category.split %}
      <p>{{ icon }}</p>
    {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2012-07-25
      • 2012-05-21
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多