Я использую формы Django на своем веб-сайте и хотел бы контролировать порядок полей.
Вот как я определяю свои формы:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
Имя является неизменным и должно быть указано только при создании объекта. Я использую наследование, чтобы добавить последовательность и принципы СУХОЙ. То, что происходит, что не является ошибочным, на самом деле вполне ожидаемым, это то, что поле имени указано последним в view / html, но я бы хотел, чтобы поле имени было в верхней части сводки и описания. Я понимаю, что могу легко это исправить, скопировав сводку и описание в create_form и потеряв наследство, но я хотел бы знать, возможно ли это.
Почему? Представьте, что у вас есть 100 полей в edit_form и вам нужно добавить 10 полей сверху в create_form - копирование и поддержание двух форм не будет выглядеть так привлекательно. (Это не мой случай, я просто делаю пример)
Итак, как мне переопределить это поведение?
Edit:
Видимо, нет правильного способа сделать это, не пройдя через неприятные хаки (возиться с атрибутом .field). Атрибут .field - это SortedDict (одна из внутренних структур данных Django), который не предоставляет никакого способа переупорядочить пары ключ: значение. Тем не менее, он обеспечивает способ вставки элементов по заданному индексу, но это переместит элементы из членов класса в конструктор. Этот метод будет работать, но сделает код менее читабельным. Единственный другой способ, который я считаю нужным, - это изменить саму платформу, которая в большинстве случаев является неоптимальной.
Короче говоря, код станет примерно таким:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
def __init__(self,*args,**kwargs):
forms.Form.__init__(self,*args,**kwargs)
self.fields.insert(0,'name',forms.CharField())
Это меня заткнуло :)