我需要创建一个内联的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
答案 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_profile
是UserProfile
。
请注意,如果基础模型具有未包含在传递到inlineformset_factory
的字段列表中的字段,则会导致验证问题,但对于任何类型的表单都是如此。