Я использую Django-формы на своем веб-сайте и хочу контролировать порядок полей.
Вот как я определяю свои формы:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
Имя является неизменным и должно указываться только при создании объекта. Я использую наследование, чтобы добавить последовательность и СУХИЕ принципы. То, что происходит, что не является ошибочным, на самом деле полностью ожидаемым, состоит в том, что поле имени указано последним в представлении /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())
Это закрыло меня:)