【发布时间】:2011-11-12 15:55:25
【问题描述】:
我现在才使用 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 日期时间选择器。我希望应用程序中的所有日期时间字段都使用相同的小部件,因此我选择这样做,而不是为每个模型中的每个字段明确地这样做。在每个表单类中添加一个额外的行并不是什么大不了的事,但它只是让我烦恼,我无法弄清楚。在 django 源代码中挖掘表明这可能是在做一些我不理解的事情:
django.forms.models
class ModelFormMetaclass(type):
def __new__(cls, name, bases, attrs):
formfield_callback = attrs.pop('formfield_callback', None)
但我不知道__init__ 和__new__ 是如何交织在一起的。在 BaseForm 中,我尝试覆盖 __init__ 并在调用 super 之前和之后设置 formfield_callback,但我猜它需要位于 args 或 kwargs 中的某个位置。
【问题讨论】:
-
它不起作用,因为 formfield_callback 不是对象的字段。这只是一个变量。
-
那么有没有办法在运行时设置呢?还是
formfield_callback = attrs.pop('formfield_callback', None)杀死了ModelFormMetaclass中的任何机会。
标签: django django-forms