通过在Django中的模板上使用过滤器对象来获取queryset

时间:2019-07-08 10:08:05

标签: django django-models django-templates

在型号中:

class Match(models.Model):
    hot_league = models.ManyToManyField(HotLeague, blank=True)

class HotLeague(models.Model):
    user = models.ManyToManyField(User, blank=True)
    price_pool = models.IntegerField()
    winner = models.IntegerField()

视图中

match = get_object_or_404(Match, pk=pk)

在这里,我需要访问此Match查询集。

这就是为什么

在模板中:

{% for hot_league in match.hot_league.all %}

通过在模板中编写match.hot_league.all,我可以获得HotLeague类的所有查询集。但是我想在这里与用户一起使用filter。像在views中一样,我们可以使用HotLeague.objects.filter(user=request.user)。但是{% for hot_league in match.hot_league.filter(user=request.user) %}不适用于模板。

如何在template中进行这种过滤?

1 个答案:

答案 0 :(得分:1)

  

如何在模板中进行这种过滤?

故意限制模板 以避免这种情况。某些模板处理器,例如Jinja可以进行函数调用,但通常,如果必须这样做,则设计会出错。视图应确定要呈现的内容,模板应以一种不错的格式呈现该内容。

在您看来,您可以将其呈现为:

def some_view(request, pk):
    match = get_object_or_404(Match, pk=pk)
    hot_leagues = match.hot_league.filter(user=request.user)
    return render(
        request,
        'some_template.html',
        {'match': match, 'hot_leagues': hot_leagues}
    )

然后,您可以在模板中将其呈现为:

{% for hot_league in hot_leagues %}
    <!-- -->
{% endfor %}