Django中的内联formset - 删除某些字段

时间:2009-02-18 00:32:45

标签: django django-admin inline-formset

我需要创建一个内联的formset

a)排除MyModel完全显示的某些字段

b)显示一些字段MyModel,但阻止它们可编辑。

我尝试使用values()使用下面的代码,以便将查询集过滤为我想要返回的值。但是,这失败了。

任何有想法的人?

class PointTransactionFormset(BaseInlineFormSet):
    def get_queryset(self):
        qs = super(PointTransactionFormset, self).get_queryset()
        qs = qs.filter(description="promotion feedback")
        qs = qs.values('description','points_type') # this does not work
        return qs

class PointTransactionInline(admin.TabularInline):
    model = PointTransaction
    #formset = points_formset()
    #formset = inlineformset_factory(UserProfile,PointTransaction)
    formset = PointTransactionFormset

3 个答案:

答案 0 :(得分:12)

在文档中似乎没有说的一件事是,您可以在模型表单集的参数中包含一个表单。因此,举例来说,假设您有一个人模型,您可以通过这样做在模型表单集中使用它

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6)

这允许您在模型表级别上执行所有表单验证,排除等,并让工厂复制它。

答案 1 :(得分:6)

这是一个在管理员中使用的formset吗?如果是这样,只需在InlineModelAdmin上设置“exclude = ['field1','field2']”即可排除字段。要显示一些不可编辑的字段值,您必须创建一个简单的自定义窗口小部件,其render()方法只返回值,然后覆盖formfield_for_dbfield()方法以将窗口小部件分配给适当的字段。

如果这不适用于admin,而是用于其他地方的formset,那么您应该在传递给formset的ModelForm子类中进行上述自定义(Meta内部类中的exclude属性,__init__方法中的widget重写)构造函数。 (如果您使用的是Django 1.2或更高版本,则可以使用readonly_fields代替。)

如果您澄清您所处的情况(管理员与否),我可以使用代码示例进行更新。

答案 2 :(得分:2)

我遇到了类似的问题(不是针对面向用户的网站的管理员),并发现您可以将您希望显示的formset和字段传递到inlineformset_factory,如下所示:

factory = inlineformset_factory(UserProfile, PointTransaction, 
                formset=PointTransactionFormset,
                fields=('description','points_type'))
formset = factory(instance=user_profile, data=request.POST)

其中user_profileUserProfile

请注意,如果基础模型具有未包含在传递到inlineformset_factory的字段列表中的字段,则会导致验证问题,但对于任何类型的表单都是如此。

相关问题