Переопределить атрибуты по умолчанию формы Django
В моем приложении Django у меня есть несколько различных форм, которые похожи по стилю. Чтобы не повторяться снова и снова, я пытаюсь переписать настройки формы по умолчанию.
Для начала я хотел установить некоторые настройки по умолчанию для каждой формы, которую я использую в своем приложении, и попытался создать подкласс django.forms.Form:
class DefaultForm(forms.Form):
error_css_class = 'alert'
error_class = DivErrorList
required_css_class = 'required'
label_suffix = ':'
auto_id = True
class TechnicalSurveyForm(DefaultForm):
location = forms.CharField(label='GPS Location')
satellite = forms.ModelChoiceField(queryset=get_satellites(), empty_label=None)
modem_sn = forms.CharField()
В моем views.py я бы назвал форму просто с
tsurvey = TechnicalSurveyForm()
К сожалению, настройки, которые я установил в DefaultForm, отсутствуют (когда я использую TechnicalSurvey(auto_id = True, error_class = DivErrorList)
они есть). Итак, я думаю, что мой подход в какой-то степени совершенно неверен. Может кто-нибудь помочь мне?
1 ответ
Я думаю, __init__
из forms.Form
инициализирует атрибуты формы. Вы должны переопределить __init__
метод и изменение атрибутов после того, как Django сделал свое дело.
РЕДАКТИРОВАТЬ: Действительно, после проверки исходного кода django, вы можете увидеть, что атрибуты объекта формы инициализируются в __init__
функция. Этот метод виден на GitHub Джанго.
class DefaultForm(forms.Form):
def __init__(self, *args, **kwargs):
super(forms.Form, self ).__init__(*args, **kwargs)
self.error_css_class = 'alert'
self.error_class = DivErrorList
self.required_css_class = 'required'
self.label_suffix = ':'
self.auto_id = True
Для начинающих Python
Такое поведение абсолютно нормально. Все атрибуты с тем же именем, объявленным в объявлении класса (как в примере с автором), будут переопределены, если они также определены в функции init. Есть небольшая разница между этими двумя типами объявления атрибутов.