Ile razy ręcz­nie skła­da­łem for­mu­larz w sza­blo­nie tylko po to, żeby pola były we wła­ści­wej kolej­no­ści? Nie mam poję­cia, ale od jakie­goś czasu sto­suję poniż­sze roz­wią­za­nie. Tak, to jest jedna z tych notek ku wła­snej pamięci.

class OrderedForm(object):
	def __init__(self, *args, **kwargs):
		super(OrderedForm, self).__init__(*args, **kwargs)
		if hasattr(self.Meta, 'fields_order'):
			self.fields.keyOrder = self.Meta.fields_order

Po umiesz­cze­niu powyż­szego w jakimś ustron­nym wspól­nym module można zabrać się za używanie:

from django.contrib.auth.models import User
from django import forms
from core.forms import OrderedForm

class UserNewForm(OrderedForm, forms.ModelForm):
	class Meta:
		model = User
		fields = ('first_name', 'last_name', 'username', 'password', 'email')
		fields_order = ('username', 'password', 'first_name', 'last_name', 'email')
	password = forms.CharField(label = u'Password', required = True, widget = forms.PasswordInput(attrs = {'autocomplete': 'off'}))

Trzeba zauwa­żyć, że OrderedForm celowo nie dzie­dzi­czy po żadnej innej kla­sie Django, dzięki czemu rów­nie dobrze działa z forms.ModelForm, co z forms.Form, jak i z dowolną wła­sną (zgodną) implementacją.