Django ModelAdmin get_form() 不设置 fields 属性
我在我的 ModelAdmin
类里重写了 get_form()
方法:
def get_form(self, request, obj=None, **kwargs):
form = super(ModelAdmin, self).get_form(request, obj, **kwargs)
现在,如果我加上这一行:
print form.fields
我就会收到一个:
AttributeError: type object 'FilerImageForm' has no attribute 'fields'
这是为什么呢?调用父类的 get_form()
方法应该能设置表单的 fields
属性吧?如果我理解错了,那我该如何在 ModelAdmin
类中访问表单的字段呢?
1 个回答
3
get_form
返回的是一个类,而不是一个实例,fields
属性是实例的属性。所以,在访问 fields 之前,你需要先创建一个表单的实例。
这是在 django/contrib/admin/options.py 中的定义:
def get_form(self, request, obj=None, **kwargs):
"""
Returns a Form class for use in the admin add view. This is used by
add_view and change_view.
"""
更新:
我需要在创建表单字段的时候进行干预,而不是在视图中。我想要改变字段的值,而不是去修改模板的上下文。我觉得
add_view()
不是合适的地方。
我认为你可以通过重写 formfield_for_dbfield
方法来实现:
def formfield_for_dbfield(self, db_field, **kwargs):
"""
Hook for specifying the form Field instance for a given database Field
instance.
If kwargs are given, they're passed to the form Field's constructor.
"""
formfield = super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == "field_you_are_looking_for":
# change formfield somehow here
# (or above, by passing modified kwargs in 'super' call)
return formfield