首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板构造..。很管用,但感觉很难看

模板构造..。很管用,但感觉很难看
EN

Stack Overflow用户
提问于 2017-03-08 14:16:38
回答 1查看 74关注 0票数 0

在模板中,我显示了项目(i)的前5个翻译。在模板中处理以下逻辑:

  • 如果有超过5个翻译:我整理列表并显示一个链接more...
  • 如果有1到5个翻译:我只需展示它们。
  • 如果没有翻译:我会显示一个链接来添加翻译。

下面是我提出的(功能)模板代码:

代码语言:javascript
复制
{% if i.translation_set.all %}
    <ul>
    {% for t in i.translation_set.all|slice:"6" %}
        {% if forloop.counter < 6 %}
        <li>
            <a href="#">
                <i class="fa fa-play mr-2"></i>
                {{ t.language }}
                <i class="fa fa-commenting-o ml-1"></i>
            </a>
        </li>
        {% else %}
            <li>more...</li>
        {% endif %}
    {% endfor %}
    </ul>
{% else %}
    <a href="{% url 'view-item' i_id=i.id slug=i.slug %}">Add translation</a>
{% endif %}

下面是我对此代码的关注:

  • if i.translation_set.all执行什么样的查询?它是查询所有的翻译,还是停止在1?
  • 使用相同的slice查询可能更好,因为这会在以后使用,并且可能是(自动)?缓存?
  • 查询6项感觉很难看,而只需要显示最多5项。是否有另一种方法可以显示超过5项?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-08 14:21:49

代码语言:javascript
复制
{% if i.translation_set.all %}

如果以后没有遍历查询集,那么应该避免执行{% if i.translation_set.all %},因为它将从数据库中获取所有的翻译。一个改进是使用exists代替。

代码语言:javascript
复制
{% if i.translation_set.exists %}

更好的是,您可以使用{% with tag %}来获取切片的查询集。然后,可以在if语句中使用切片的查询集,并对其进行循环。

代码语言:javascript
复制
{% with translations=i.translation_set.all|slice:"6" %}
{% if translations %}
<ul>
    {% for t in translations %}
    ...
    {% endfor %}
</ul>
...
{% endif %}
{% endwith %}

在切片中获取6个对象的另一个替代方法是将计数作为一个单独的查询来获取。然后,可以将切片限制为5个对象。

代码语言:javascript
复制
{% with translation_count=i.translation_set.count %}
{% if translations_count %}
<ul>
    {% for t in translations|slice:"5" %}
    ...
    {% endfor %}
    {% if t.count > 5 %}
      <li>more...</li>
    {% endif %}
</ul>
...
{% endif %}
{% endwith %}

这使用两个查询而不是一个查询,但是如果您发现它更清楚,您可能会更喜欢它。实际上,额外的查询可能对性能没有任何影响。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42673716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档