Я использую Django уже пару недель, поэтому я могу подходить к этому всевозможные ошибки, но:
У меня есть базовый ModelForm, в который я помещал некоторые файлы шаблонов, чтобы как можно более сухие вещи, и все мои фактические ModelForms просто подклассы, которые являются базовыми. Это отлично работает для error_css_class = 'error'
и required_css_class = 'required'
, но formfield_callback = add_css_classes
работает не так, как я ожидал.
forms.py
# 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
Конечная цель состоит в том, чтобы пощекотать некоторые сборщики jquery datetime в формах с классом datefield/timefield/datetimefield. Я хочу, чтобы все поля времени даты в приложении использовали один и тот же виджетов, поэтому я решил сделать это таким образом, чем это явно для каждого поля в каждой модели. Добавление дополнительной строки к каждому классу формы не является чем-то большим, но это просто исказило меня, что я не мог понять это. Копание в источнике django показало, что это, вероятно, делает то, что я не понимаю:
django.forms.models
class ModelFormMetaclass(type):
def __new__(cls, name, bases, attrs):
formfield_callback = attrs.pop('formfield_callback', None)
Но я не знаю, как все __init__
и __new__
все перепутаны. В BaseForm я попытался переопределить __init__
и установить formfield_callback до и после вызова super, но я предполагаю, что он должен быть где-то в args или kwargs.