Ile razy ręcznie składałem formularz w szablonie tylko po to, żeby pola były we właściwej kolejności? Nie mam pojęcia, ale od jakiegoś czasu stosuję poniższe rozwiązanie. Tak, to jest jedna z tych notek ku własnej 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 umieszczeniu powyższego w jakimś ustronnym wspólnym 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 dziedziczy po żadnej innej klasie Django, dzięki czemu równie dobrze działa z forms.ModelForm, co z forms.Form, jak i z dowolną własną (zgodną) implementacją.