Я использую Django-формы на своем веб-сайте и хочу контролировать порядок полей.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())
Это меня заткнуть :)
Это уже много лет спустя. Я уверен, что вы уже знаете это, но имена классов в python всегда должны быть «CamelCased». Только имена методов называются «named_with_underscore». –
Вы имели в виду «camelCased»? :) – jball037
TitleCase - правильный термин, я считаю. –