Django ModelAdmin get_form() 不设置 fields 属性

3 投票
1 回答
2917 浏览
提问于 2025-04-17 22:49

我在我的 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

撰写回答