Django ModelAdmin的get_form()方法没有设置fields属性。

3

我在我的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类中访问表单字段?

那么 get_form() 的主要作用是什么?另外,如果是这种情况,我该如何在 ModelAdmin 类中访问表单上的字段? - linkyndy
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

那么我该如何拦截 ModelAdmin 中的表单创建以便之后可以修改其字段呢? - linkyndy
@AndreiHorak,表单在add_viewchange_viewModelAdmin方法中实例化,请检查它们。 - ndpu
我需要拦截表单字段的创建,而不是视图。我需要更改字段的值,而不是搞乱模板的上下文。我认为add_view()不是这个问题的适当位置。 - linkyndy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接