在Django admin上修改空间窗口小部件表单集

时间:2014-05-19 18:51:55

标签: python django django-admin inline-formset

我正在使用TabularInline重新组织Django 1.6管理员中的某些模型。当我尝试覆盖正在使用的默认表单时,我遇到了困难。我已阅读了文档here的相关部分。使用formfield_overrides我尝试使用以下方式更改表单:

formfield_overrides = {
    models.PointField: {'widget': Textarea},
}

我使用以下方法继承admin.ModelAdmin

class DirectAdmin(admin.ModelAdmin):

    def get_inline_instances(self, request, obj=None):

        overrides = {
            models.PointField: {'widget': Textarea},
        }

        for inline in self.inlines:
            inline.formfield_overrides = overrides
            return inline(self.model, self.admin_site)

然而,当我尝试这种方法时,我收到以下错误:

TypeError: zip argument #2 must support iteration

当我进入这个循环时,我可以看到inline.formfield_overrides确实存在为空字典,但我不知道正确的值应该是什么。这是正确的方法吗?当使用TabularInline对模型进行分组时,还有其他方法可以修改这些小部件吗?

1 个答案:

答案 0 :(得分:1)

通常你应该在TabularInline或StackableInline defenition中使用formfield_overrides属性。

例如:

from django.contrib import admin
from myapp.models import City, Shop

class ShopInline(admin.TabularInline):
    formfield_overrides = {
        models.PointField: {'widget': Textarea},
    }
    model = Shop

class CityAdmin(admin.ModelAdmin):
    inlines = [ShopInline,]

但是如果你想为所有内联设置小部件:

class DirectAdmin(admin.ModelAdmin):

def get_inline_instances(self, request, obj=None):

    overrides = {
        models.PointField: {'widget': Textarea},
    }
    inline_instances = super(DirectAdmin, self).get_inline_instances(request, obj=obj)
    for inline in inline_instances:
        inline.formfield_overrides = overrides
    return inline_instances

为了更好地理解,请检查get_inline_instance definition