使用带空格的键

Posted

技术标签:

【中文标题】使用带空格的键【英文标题】:Using keys with spaces 【发布时间】:2010-12-16 03:31:12 【问题描述】:

有没有办法在 Django 模板中执行以下操作?

   % for hop in hops%
    <tr>  
      <td> hop.name </td>
      <td> hop.mass </td>  
      <td> hop."boil time" </td>
    </tr>
  % endfor %

跳跃。“煮沸时间”不起作用。简单的解决方案是重命名键煮沸时间,但我对替代品感兴趣。

【问题讨论】:

【参考方案1】:

最好的方法是将属性名称偷偷带入另一个变量,如下所示:

% for key, value in hop.items %
    % ifequal key 'boil time' %
         value 
    % endifequal %
% endfor %

在 Django 0.96(Google AppEngine 使用的版本)中,模板语言不支持元组扩展,所以有点丑:

% for hop in hops %
    <tr>
        <td> hop.name </td>
        <td> hop.mass </td>
        <td>
            % for item in hop.items %
                % ifequal item.0 'boil time' %
                     item.1 
                % endifequal %
            % endfor %
        </td>
    </tr>
% endfor %

因此,获取您的代码,我们最终得到:

% for hop in hops %
    <tr>
        <td> hop.name </td>
        <td> hop.mass </td>
        <td>
            % for key, value in hop.items %
                % ifequal key 'boil time' %
                     value 
                % endifequal %
            % endfor %
        </td>
    </tr>
% endfor %

在 Django 0.96(Google AppEnginge 上的版本)中,变为:

% for hop in hops %
    <tr>
        <td> hop.name </td>
        <td> hop.mass </td>
        <td>
            % for item in hop.items %
                % ifequal item.0 'boil time' %
                     item.1 
                % endifequal %
            % endfor %
        </td>
    </tr>
% endfor %

甚至还有更冗长的方法可以使用 regroup 标签:

% regroup hop.items by 'boil time' as bt %
    % for item in bt %
        % if forloop.first %
            % for item2 in item.list %
                % for item3 in item2 %
                    % if not forloop.first %
                         item3 
                    % endif %
                % endfor %
            % endfor %
        % endif %
% endfor %

【讨论】:

Django 模板语言不允许这样做。 hop['boil time'] 的模板语言等效为 hop.boil time(我认为这是他遇到的问题)。 这是我在上面所做的评论的参考,表明. 符号涵盖了索引...docs.djangoproject.com/en/dev/ref/templates/api/… 我很欣赏写出所有代码的努力,但由于某种原因,它似乎对我不起作用,复制和粘贴事件。即使没有 ifequals,我也无法对字典进行迭代以打印任何键或值。 Dan,我实际上在我正在运行的一个实例上测试了代码,并且它在两种情况下都有效......我唯一能想到的是项目的问题。试着做一个 hop.items 看看会发生什么。如果字典覆盖了 items 方法,这可能会导致问题(例如,hop 具有“items”属性,然后尝试 hop.iteritems) 您可以通过在 main.py 中指定版本来在 Google App Engine 上实际使用 Django 1.0(或 1.1):code.google.com/appengine/docs/python/tools/…【参考方案2】:

您可以使用来自 djangosn-ps 的 get 过滤器:http://www.djangosnippets.org/snippets/1412/

(重命名密钥可能更好......)

【讨论】:

我会试一试,然后告诉你进展如何。 伙计,我做的 Ruby 太多了。我的倾向是monkeypatch dict 将下划线转换为空格... 我可能应该提到我在 google appengine 中使用 django 模板,而不是完整的 django 应用程序。似乎没有添加过滤器的简单方法。【参考方案3】:

对于 django 0.96,这是 Google Appengine 用于模板的,以下工作:

% for hop in recipe.get_hops %
    % for item in hop.items %
          % ifequal item.0 'boil time' %
              <p> item.1 </p>
          % endifequal %
        % endfor %   
  % endfor %

item.0 是键,item.1 是值。 Link.

【讨论】:

以上是关于使用带空格的键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSONField 中使用 Postgres 在 Django 中搜索带有空格的键?

带有包含空格的键的 lua 表构造函数

如何在胶合时分离(带有空格)字符串,使用数组中的键来检查它是否粘合?

如何使用带空格的 VueJS 数据键

如何使用 sqoop 导入支持带空格的列名?

使用 CreateProcess 运行带空格的 bat