List_filter labels for foreign key filters in django admin are always ordered by id and that can cause a pretty mess when there are many filters in the list.
I have been searching for simple solution how to order those labels alphabetically or by date for some time now. It seemed that besides of using FilterSpec there is no solution for it.
Until I did this.
I have changed the template for filter.html (put it in admin folder in your templates directory) so it looks like this (found it somewhere on django snippets I guess):
{% load i18n %}
<h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
<div align="right">
<select onChange="javascript:window.location = this.options[this.selectedIndex].value;" style="width: 80%">
{% for choice in choices %}
<option {% if choice.selected %}selected{% endif %} value="{{ choice.query_string|iriencode }}">
{{ choice.display }}
</option>
{% endfor %}
</select>
</div>
And then I used 'dictsort:"name"' template tag on for loop so the template finally looked like this:
{% load i18n %}
<h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
<div align="right">
<select onChange="javascript:window.location = this.options[this.selectedIndex].value;" style="width: 80%">
{% for choice in choices|dictsort:"display" %}
<option {% if choice.selected %}selected{% endif %} value="{{ choice.query_string|iriencode }}">
{{ choice.display }}
</option>
{% endfor %}
</select>
</div>
I have used select drop-down since I had many labels, but it can be used on the standard 'ul' list too. Now I finally have all my foreign key based filters ordered alphabetically (and it works even if using dates).
If you need reversed dosting there is dictsortreversed template tag for that.
Hope that this helps someone.
Errr, the question itself contains the answer. Sorry for not structuring it better.