Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sorting objects in template

Let these models:

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)

this view:

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

and this template:

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

I'd like to sort words in template by number of votes and by pub date, separately. How can I do this?

like image 354
msampaio Avatar asked Sep 02 '12 19:09

msampaio


2 Answers

You can make custom template tag or filter, which gets words set and sorting type as parameters.

For example (haven't tested):

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 %}
...
like image 56
Serhii Holinei Avatar answered Oct 23 '22 04:10

Serhii Holinei


You can do it in the views

words = Word.objects.all().order_by('votes', 'pub_date')
like image 5
Rakesh Avatar answered Oct 23 '22 03:10

Rakesh