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ą.