Обновление
.keyOrder
больше не работает.Я считаю, что это должно работать вместо:
from collections import OrderedDict
class MyForm(forms.ModelForm):
…
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
field_order = ['has_custom_name', 'name']
reordered_fields = OrderedDict()
for fld in field_order:
reordered_fields[fld] = self.fields[fld]
for fld, value in self.fields.items():
if fld not in reordered_fields:
reordered_fields[fld] = value
self.fields = reordered_fields
Предыдущий ответ
Существуют вещи, которые могут изменить порядок формы независимо от того, как вы объявите их в определении формы.Один из них - если вы используете ModelForm
, и в этом случае, если у вас нет обоих полей, объявленных в fields
в class Meta
, они будут в непредсказуемом порядке.1014 * есть надежное решение .
Вы можете управлять порядком полей в форме, задав self.fields.keyOrder
.
Вот пример кода, который вы можете использовать:
class MyForm(forms.ModelForm):
has_custom_name = forms.BooleanField(label="Should it have a custom name?")
name = forms.CharField(required=False, label="Custom name")
class Meta:
model = Widget
fields = ['name', 'description', 'stretchiness', 'egginess']
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
ordered_fields = ['has_custom_name', 'name']
self.fields.keyOrder = ordered_fields + [k for k in self.fields.keys() if k not in ordered_fields]
def clean_name(self):
data = self.cleaned_data
if data.get('has_custom_name') and not data.get('name'):
raise forms.ValidationError("You must enter a custom name.")
return data.get('name')
Если установлено keyOrder
, has_custom_name
будет проверено (и, следовательно, присутствует в self.cleaned_data
) до подтверждения name
.