который можно использовать как (по крайней мере, в Django 1.6)

ользую 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.

Ответы на вопрос(4)

Ваш ответ на вопрос