【问题标题】:Avoid duplicate "if conditions" in django template HTML tables避免在 Django 模板 HTML 表中出现重复的“if 条件”
【发布时间】:2016-12-09 23:22:10
【问题描述】:

根据访问网页的用户,生成的 HTML 表格可能会显示额外的列。我当前的实现检查模板文件中每一行的标志,其中show_secret_column 是 view 设置的标志:

<div class="table-responsive">
    <table class="table">
        <thead>
            <tr>
                <th class="col-md-4">Column 1 Header</th>
                <th class="col-md-2">Column 2 Header</th>
                <th class="col-md-2">Column 3 Header</th>
                {% if show_secret_column %}
                <th class="col-md-2">Secret Column Header</th> 
                {% endif %}
            </tr>
        </thead>
        <tbody>
            {% for row in row %}
            <tr>
                <td>{{ row.a }}</td>
                <td>{{ row.b }}</td>
                <td>{{ row.c }}</td>
                {% if show_secret_column %}
                <td>{{ row.secret }}</td>
                {% endif %}
            </tr>
            {% endfor %}
        </tbody>
    </table>
</div>

这是一个不好的方法吗?是否有任何其他方法建议在模板中只执行一次此检查并生成额外的列?

【问题讨论】:

  • 这对我来说很好
  • @thedarklord47,我可以检查重复的if 条件是否执行得非常缓慢,导致随着行数的增加缩放不良?它“感觉”它正在放缓,我宁愿在两周后压力测试人员抱怨时不解决这个问题......
  • 这个表应该有多少行?
  • @thedarklord47 我们网站现有版本中最大的表是 40k 行
  • 我认为您正在尝试解决一个不存在的问题。除非您在使用此特定代码时遇到性能问题(不太可能 - 简单的布尔检查并不昂贵),否则请保持原样。

标签: html django django-templates html-table


【解决方案1】:

如果您真的想针对如此大的行数进行微优化(我强烈建议您不要这样做),您可以像这样复制模板:

{% if show_secret_column %}
    <thead>
        <tr>
            <th class="col-md-4">Column 1 Header</th>
            <th class="col-md-2">Column 2 Header</th>
            <th class="col-md-2">Column 3 Header</th>
            <th class="col-md-2">Secret Column Header</th> 
        </tr>
    </thead>
    <tbody>
        {% for row in row %}
        <tr>
            <td>{{ row.a }}</td>
            <td>{{ row.b }}</td>
            <td>{{ row.c }}</td>
            <td>{{ row.secret }}</td>
        </tr>
        {% endfor %}
    </tbody>
{% else %}
    <thead>
        <tr>
            <th class="col-md-4">Column 1 Header</th>
            <th class="col-md-2">Column 2 Header</th>
            <th class="col-md-2">Column 3 Header</th>
        </tr>
    </thead>
    <tbody>
        {% for row in row %}
        <tr>
            <td>{{ row.a }}</td>
            <td>{{ row.b }}</td>
            <td>{{ row.c }}</td>
        </tr>
        {% endfor %}
    </tbody>
{% endif %}

我只想重申,如果我在我的代码中看到这一点,我会感到震惊。它现在非常脆弱(您必须小心复制对这两个部分所做的所有更改)。它也只是很多臃肿和碍眼。

您的主要目标首先应该是没有包含 40k 行的表。也就是说,这将满足您的要求。

【讨论】:

  • 感谢您的回答。是的,该表将分页并一次加载 100 行。这(循环提升)是显而易见的解决方案,但它的重复代码比我的还要多,不幸的是,AFAIK,Python 不会自动执行此操作。
  • 我可以将除秘密列之外的所有内容都放在一个单独的模板中以避免重复,然后在两个地方都只需 {% include %} 它以避免“复制更改”问题。我只是希望模板有更好的出路……哦,好吧……
  • 如果你只渲染 100 行,你的渲染时间可以忽略不计。我仍然不会担心额外的如果。我认为您正在进行微优化。
  • 一个用户有 100 行。在峰值负载时,我们每分钟有约 400 个活跃用户。虽然点了。
猜你喜欢
  • 2014-05-15
  • 2017-08-05
  • 2022-11-10
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多