10

我需要创建一个内联表单集

MyModela)完全不显示某些字段

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
4

3 回答 3

12

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

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

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

于 2011-01-26T03:55:05.787 回答
6

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

如果这不是用于管理员,而是用于其他地方的表单集,那么您应该在传递给表单集构造函数的 ModelForm 子类中进行上述自定义(排除 Meta 内部类中的属性, __init__ 方法中的小部件覆盖)。(如果您使用的是 Django 1.2 或更高版本,则可以只使用readonly_fields代替)。

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

于 2009-03-07T20:30:21.097 回答
2

我刚刚遇到了类似的问题(不适用于管理员 - 面向用户的站点),发现您可以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,但任何类型的表单都是如此。

于 2009-09-09T10:43:34.363 回答