使用<ol> -tag

时间:2017-04-21 15:50:59

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

我想写一个

的模板
  • 是分页(不是同一页面上的所有列表项)
  • 使用-tag编号,因为这是订购列表的最具语义性的方式
  • 可以反转或不反对
  • 这些数字与所代表的模型相关联(每个li - 标记包含一个a - 标记,该标记链接到模型。)这意味着列表不会以1开始。

我的模特:

class Mymodel(models.Model):
  number = positiveIntegerField() 
  title = models.CharField(max_length=100)
  [...]

number是唯一的,有序的,当您订购带有编号的模型时,没有间隙; number是从1开始的

我拥有:(reverse是布尔变量,它告诉列表是否必须反转)

{% if reverse %}
<ol class="content" start="{{ article_list.0.number|add:article_list.count }}" reversed=true>
    {% for article in article_list reversed %}
        <li class="{% cycle '' '' '' '' 'seperate-bot border-gray' %}"><a href="{% url 'myapp:article' article.number %}">{{ article.title }}</a></li>
    {% endfor %}
{% else %}
<ol class="content" start="{{ article_list.0.number }}">
    {% for article in article_list %}
        <li class="{% cycle '' '' '' '' 'seperate-bot border-gray' %}"><a href="{% url 'manifest:article' article.number %}">{{ article.alt_title }}</a></li>
    {% endfor %}
{% endif %}
</ol>

不幸的是,计算后退模板部分是错误的:最后一个数字总是1,它不应该是。最后一个数字应为article_list.0.number + article_list.count(或:article_list|length) - 1;或last_list_item.number会更好。

这意味着:(对于该示例,paginated_by = 3)&#34; |&#34;因为SO改变了我的计数 应该如何:(反向=真)

第1页

| 3。 lorem ipsum

| 2。 lorem ipsum

| 1。 lorem ipsum

第2页

| 5。 lorem ipsum

| 4。 lorem ipsum

我得到什么 :(只有第2页不好)

第2页

| 2。 lorem ipsum

| 1。 lorem ipsum

有没有一种避免这种效果的好方法? (它来自哪里?)最好的情况只能在模板中使用。

1 个答案:

答案 0 :(得分:1)

我不确定你为什么会得到那个结果,但这似乎是一种过于复杂的方式来做一些非常简单的事情。

您可以使用内置的(1:5)/(3:5)过滤器和last模板标签来访问列表中的最后一项。

with

但是,我建议您在视图功能中而不是在模板中进行排序和反转。 Django的模板语言不适用于非平凡的逻辑。

对于编号,您实际上可以显式地将值属性分配给有序列表元素。这可以解决您的问题。

{% with article_list|last as last_article %}
<ol class="content" start="{{ last_article.number }}" reversed=true>
{% endwith %}

示例:

&#13;
&#13;
<li value={{ article.number }} ...
&#13;
&#13;
&#13;