Переопределить атрибуты по умолчанию формы 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. Есть небольшая разница между этими двумя типами объявления атрибутов.

Другие вопросы по тегам