【问题标题】:Django templates - split string to arrayDjango 模板 - 将字符串拆分为数组
【发布时间】:2012-01-09 04:37:27
【问题描述】:

我有一个模型字段,它将 URL 列表(是的,我知道,这是错误的方式)存储为 url1\nurl2\nurl3<...>。我需要在模板中将字段拆分为一个数组,因此我创建了自定义过滤器:

@register.filter(name='split')
def split(value, arg):
    return value.split(arg)

我是这样用的:

{% with game.screenshots|split:"\n" as screens %}
        {% for screen in screens %}
            {{ screen }}<br>
        {% endfor %}
    {% endwith %}

但正如我所见,split 不想工作:我得到像url1 url2 url3 这样的输出(如果我查看源代码,则带有换行符)。为什么?

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案1】:

    除了您的原始解决方案是否是正确的方法之外,我猜原始代码不起作用,因为\n 在 Python 代码中的含义与在 HTML 中的含义不同:在 Python 代码中,它意味着转义换行符,在 HTML 中它只是两个单独的字符 \n。 因此,将 HTML 模板作为输入参数 \n 传递给 Python 代码等效于拆分 Python 字符串 \\n:文字 \ 后跟 n

    【讨论】:

    • 实际上,这是真正回答问题的答案(为什么 OPs 模板过滤器不起作用?)!但是,问题没有解决办法。
    【解决方案2】:

    我想拆分一个单词列表来计算字数,结果发现有一个过滤器:

    {{ value|wordcount }}
    

    https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#wordcount

    【讨论】:

      【解决方案3】:

      Django 有意遗漏了许多类型的模板标签,以阻止您在模板中进行过多的处理。 (不幸的是,人们通常只是自己添加这些类型的模板标签。)

      这是一个完美的例子,说明应该在你的模型而不是你的模板中。

      class Game(models.Model):
          ...
          def screenshots_as_list(self):
              return self.screenshots.split('\n')
      

      然后,在您的模板中,您只需:

      {% for screen in game.screenshots_as_list %}
          {{ screen }}<br>
      {% endfor %}
      

      更清晰,更容易使用。

      【讨论】:

      • 但请记住,过胖的模型可能会变成一堆无法维护的东西。这种特定情况是有效的——您会将一些序列化数据转换为 Python,这在模型层上是有意义的。 (您甚至可以使该方法成为计算属性。)但是,如果您想在模型上放置一个方法 just 以便您可以从模板中调用它,请三思而后行——也许它会是可以在您的视图中进行这种处理:)
      • 如果内容来自models.Model,则优于模板标签
      • 太棒了!为我工作!
      【解决方案4】:

      linkebreaksbr 的功能已经存在:

      {{ value|linebreaksbr }}
      

      https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#linebreaksbr

      【讨论】:

      • 不,我不需要简单地将它们格式化为 HTML,我需要明确地将其拆分到列表中以使用它。
      【解决方案5】:

      嗯,我已经部分解决了这个问题。我将过滤器更改为:

      @register.filter(name='split')
      def split(value, arg):
          return value.split('\n')
      

      为什么它不适用于原始代码?

      【讨论】:

      • 也许你需要逃跑\n?
      • 如果您从模板中传递"\n",这将作为纯字符串传递,而\n 作为换行符的特殊含义将丢失。
      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 2016-04-01
      • 2012-02-22
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多