Django-sorting-bootstrap is a pluggable mini-API to easy add sorting for querysets, links and table headers in Django templates. There is also a new tag that creates headers for sorting tables using Bootstrap's layout.
To install django-sorting-bootstrap
simply run:
pip install django-sorting-bootstrap
Include django_sorting_bootstrap
in your INSTALLED_APPS
Put {% load sorting_tags %}
at top of your templates.
Your templates have four tags available:
auto_sort
sort_link
sort_th
sort_headers
{% auto_sort queryset %}
{% sort_link "link text" "field_name" %}
{% sort_th "link text" "field_name" %}
{% sort_headers simpleschangelist %}
For sorting to work, your views have to
- add the current sort field to the context
- apply the sorting to the queryset
For a generic ListView, this could be done as follows::
from django.views.generic import ListView
class ExampleListView(ListView):
model = MyModel
def get_context_data(self, **kwargs):
# add current sort field to context
c = super(ExampleListView, self).get_context_data(**kwargs)
if "sort_by" in self.request.GET:
c["current_sort_field"] = self.request.GET.get("sort_by")
return c
def get_queryset(self):
# apply sorting
qs = super(ExampleListView, self).get_queryset()
if "sort_by" in self.request.GET:
qs = qs.order_by(self.request.GET.get("sort_by")
return qs
It sorts the queryset in place and replaces the queryset by the sorted queryset.
This needs to be called prior to a slice has been taken from a queryset.
(Ordering can not be done after the slice has been taken.) In particular this will
not work with generuc view object_list
.
Basic usage:
{% auto_sort queryset %}
Sort link outputs a link which will sort on the given field. The field to sort on should be
a database field, or something which .order_by
of queryset would work.
Basic usage:
{% sort_link "link text" "field_name" %}
Example usage:
{% sort_link "Name" "name" %}
It may also be used as:
{% sort_link "link text" "field_name" "vis_name" %}
{% sort_link "Name" "name" "what" %}
This is useful if you do not wnat to expose your database fields in urls.
It works the same way as sort_link, but the difference is the output template that renders a table header tag <th>
using Bootstrap
_ classes and Glyphicons.
Basic usage:
{% sort_th "link text" "field_name" %}
This function is somewhat more complicated to use, but it builds the whole table headers for sorting. In order to use it you have to pass in your view a SimplesChangeList (from sorting_bootstrap.views). Let's have an exemple using a view extending Generic ListView.
from django.views.generic import ListView
from sorting_bootstrap.views import SimpleChangeList
class MyView(ListView)
def get_context_data(self, **kwargs):
# Calls the base implementation first to get a context
context = super(self.__class__, self).get_context_data(**kwargs)
# Gets the fields that are going to be in the headers
list_display = [i.name for i in self.model._meta.fields]
# Doesnt show ID field
list_display = list_display[1:]
cl = SimpleChangeList(self.request, self.model, list_display)
# Pass a change list to the views
context['cl'] = cl
return context
You also need to call the function in your template:
<thead>
<tr>
{% sort_headers cl %}
</tr>
</thead>
This app is based on Agiliq's django-sorting 0.1. It has two improvements over it: the new tags and the Twitter Bootstrap compliance idea.