Я сейчас использовал только Django на пару недель, поэтому я могу приблизиться к этому всевозможным неправильным, но:
У меня есть базовая модификация, которую я Поместите несколько бойных материалов, чтобы сохранить вещи как можно сухими, и все мои фактические модификации просто подклассят эту базовую форму. Это отлично работает для error_css_class = 'Error'
и требуется_csss_class = 'Trance'
, но formfield_callback = add_css_classes
не работает так, как будто я ожидаю.
# snippet I found
def add_css_classes(f, **kwargs):
field = f.formfield(**kwargs)
if field and 'class' not in field.widget.attrs:
field.widget.attrs['class'] = '%s' % field.__class__.__name__.lower()
return field
class BaseForm(forms.ModelForm):
formfield_callback = add_css_classes # not working
error_css_class = 'error'
required_css_class = 'required'
class Meta:
pass
class TimeLogForm(BaseForm):
# I want the next line to be in the parent class
# formfield_callback = add_css_classes
class Meta(BaseForm.Meta):
model = TimeLog
Конечная цель - ударить несколько пикеров DateTime jQuery на формах с классом DateField / Timefield / DateTimeField. Я хочу все поля времени даты в приложении использовать тот же виджет, поэтому я решил сделать это таким образом, чем явно делать это для каждого поля в каждой модели. Добавление дополнительной линии к каждому классу форм не такая большая сделка, но она просто помешала мне, что я не мог понять это. Копая в источнике Django, показал, что это, вероятно, делает что-то, что я не понимаю:
class ModelFormMetaclass(type):
def __new__(cls, name, bases, attrs):
formfield_callback = attrs.pop('formfield_callback', None)
Но я не знаю, как __ init __
и __ новое __
все водушены. В BaseForm я попробовал переопределить __ init __
и настроить formfield_callback до и после вызова super, но я предполагаю, что он должен быть где-то в args или kwargs.