在模板中排序对象

时间:2012-09-02 19:11:03

标签: django django-templates django-views

让这些模型:

class Category(models.Model):
    name = models.CharField(max_length=20)

class Word(models.Model):
    name = models.CharField(max_length=200)
    votes = models.IntegerField(default=1)
    categories = models.ManyToManyField(Category, null=True, blank=True)

这个观点:

def main_page(request):
    words = Word.objects.all()
    categories = Category.objects.all()
    return render(request, "main_page.html", {'words': words})

和这个模板:

{% for category in categories %}
    {% for word in category.word_set.all %}
    <p>{{ word }}</p>
    {% endfor %}
{% endfor %}

我想分别按照投票数和出版日期对模板中的单词进行排序。我怎么能这样做?

3 个答案:

答案 0 :(得分:11)

你可以制作custom template tag or filter,它将单词设置和排序类型作为参数。

例如(尚未测试):

<强> custom_tags.py:

from django import template
register = template.Library()

@register.filter
def sort_by(queryset, order):
    return queryset.order_by(order)

<强> template.html

{% load custom_tags %}
...
{% for word in category.word_set.all|sort_by:'-votes' %}
    <p>{{ word }}</p>
{% endfor %}
...

答案 1 :(得分:4)

您可以在视图中执行此操作

words = Word.objects.all().order_by('votes', 'pub_date')

答案 2 :(得分:0)

你也可以:

  1. 在类别模型中添加特殊方法
  2. 在自定义相关管理器中为Word添加简单快捷方法
  3. 在Word中使这个排序默认为一个(说实话我不喜欢这个)