Well, you've got a couple of options.  One is easiest and most
straightforward, but could impact performance.  The second is a little
bit more work, but would limit the ordering to only taking effect on
that one form.

The first way is to use the Meta option `ordering = ('fieldname',)`,
as described here:
http://docs.djangoproject.com/en/dev/ref/models/options/#ordering

Bare in mind that this will passively affect ALL queries you do to
that model's objects, unless you specifically tell it not to order
during the query.  If you think that you'll *always* want that sort
order to take effect, then this is the preferred method of
accomplishing that.

The second way is to intercept the form's queryset powering the
widget.  If you're not using Form objects with your admin (ie, you're
just specifying 'fields' or 'fieldsets' on your ModelAdmin), then
you'll have to take a quick sidequest:

Create a class somewhere (preferably in your app's directory, in a
"forms.py" file or something obvious) like so:

    from django import forms
    from models import MyModel
    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
        def __init__(self, *args, **kwargs):
            forms.ModelForm.__init__(self, *args, **kwargs)
            self.fields['myfieldname'].queryset =
MyModel.objects.order_by('custom_sort_field_name')

And then back in your ModelAdmin, add this attribute to the class:

    # ...
    from forms import MyModelForm
    form = MyModelForm

This will cause the admin to use *your* form instead of the default.
What I've done is created a form which simply hijacks the queryset on
'myfieldname' (the field you're trying to sort), and alters it before
the widget has a chance to render itself.


Both methods are effective, but be sure to consider my initial
statement, about performance impact.  Pick the method that strikes the
balance in your mind between performance and practicality.

Hope that helps!

On Nov 25, 1:06 pm, rc <reedcr...@gmail.com> wrote:
> I have configured a modeladmin which uses the filter_horizontal
> feature. I would like to be able to order left side of this feature by
> name instead of the default (which I believe is by id). Is this
> possible? I see how to use "ordering" in the display for change lists,
> but not sure how to apply that to the 'left' side data of the
> filter_horizontal.

--

You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.


Reply via email to