Django模板限制for循环的输出

时间:2014-01-15 17:53:56

标签: django django-models django-templates django-views

所以我有一个模板:

{% for Chapter in latest_chapter_list %}
                        {% ifequal Chapter.manga|truncatechars:20 Manga.name|truncatechars:20 %}
                            {{Chapter.chapter}}
                        {% endifequal %}
                    {% endfor %}

模型:

class Manga(models.Model):
    name = models.CharField(max_length=20,help_text='Name of the comic/manga')

class Chapter(models.Model):
    manga = models.ForeignKey(Manga)
    chapter = models.IntegerField(default=1, help_text='Number of a chapter')

所以我想要的是模板只显示5个项目而不是所有传递if的项目。在普通代码中,我会添加一个临时值来计算每个添加,然后重置,但我是django的新手,我不知道如何处理它。 此外,我无法弄清楚为什么我只会将两个名字切成相等的长度,即使它们应该是相同的长度,不应该这样吗?

我的意见:

def index(request):
    latest_item_list = Manga.objects.all().order_by('-added_on')[:5]
    latest_chapter_list = Chapter.objects.all().order_by('-chapter')



    context = {'latest_item_list': latest_item_list,
               'latest_chapter_list': latest_chapter_list
}
    return render(request, 'Item/index.html', context)

任何帮助或提示将不胜感激!

编辑,解决方案:在视图中制作了新的过滤列表:

latest_chapter_list_short = Chapter.objects.filter(chapter__lt=6)

并通过它迭代而不是完整列表!

1 个答案:

答案 0 :(得分:0)

Django的模板功能有限,因此只能迭代您希望显示的元素。例如,您可以在视图中准备数据,只包含五个元素:

latest_item_list = Manga.objects.all().order_by('-added_on')[:5]
chapters = Chapter.objects.all().order_by('-chapter')
latest_chapter_per_mange = compute_chapters_per_mange(chapters, latest_item_list)

其中compute_chapters_per_mange确定每个Manga模型的章节。

你的第二个问题:Django现在正在将Manga对象的字符串表示与Manga.name进行比较,这可能不一样。这可以解释为什么你需要truncatechars,虽然我不完全明白为什么。如果您在__unicode__模型上定义Manga方法,则可以指定该模型的实例应如何显示为字符串(即self.name)。