In my continued experimentation with the newforms-admin branch of Django, I wanted to figure out how to order fields of an inline. Looking at the documentation for inlines I saw there was not an ordering field.
I had thought that there was but it turns out I was just mistaken in the object hierarchy. InlineModelAdmin inherits from BaseModelAdmin the same as ModelAdmin — I was thinking that InlineModelAdmin inherited from ModelAdmin.
Therefore, I had to determine a way to accomplish this via some spelunking through the code. At first, I thought I’d just create my own template by inheriting or copying the tabular.html template. After looking at it, I determined that I didn’t want to figure out how to do a regroup on inlineadminformset or if even that was the proper way to try to order things in that template.
After a few minutes in the code I realized that I could just subclass BaseInlineFormset and specify the fields that I wanted to order by (in this example I will use starttime and endtime:
from django.contrib import admin
from django.newforms.models import BaseInlineFormset
class MyOrderedFormset(BaseInlineFormset):
def get_queryset(self):
qs = super(SessionInlineFormset, self).get_queryset()
return qs.order_by('start_time', 'end_time')
class MyOrderedInline(admin.TabularInline):
model = MyModel
extra = 1
formset = MyOrderedFormset
That’s it. Now after that section of inlines are ordered by starttime and endtime.












1 comment so far ↓
Thanks for this post, was very helpful
A couple of changes I had to make to work with a current checkout:
replaced SessionInlineFormset with BaseInlineFormset.
newforms has been changed to forms.
After those changes it worked brilliantly and saved me a HEAP of time, thanks
Leave a Comment