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