我有一个内联formset,我想排除一些模型对象在formset中显示。
例如。模型B具有模型A的外键,因此它是1:n(一个对象有很多B对象)的关系。现在在一个管理编辑页面上,我有了B的内联。我想知道是否有可能以某种方式在呈现内联formset之前过滤B对象列表,因此并非所有与B对象相关的A都会进入formset。
答案 0 :(得分:18)
回答自己的问题似乎有点奇怪,但我找到了另一个解决方案;)
向表单集提供自定义查询集时出现问题,如果是内联表单集,则没有挂钩。所以我将BaseInlineFormSet子类化并覆盖了get_queryset方法。然后我只是在InlineModelAdmin中提供这个formset并完成它。
示例:
class MyFormSet(BaseInlineFormSet):
def get_queryset(self):
if not hasattr(self, '_queryset'):
qs = super(MyFormSet, self).get_queryset().filter(main=False)
self._queryset = qs
return self._queryset
和管理员类:
class MyInline(admin.TabularInline):
model = m.MyModel
formset = MyFormSet
...
答案 1 :(得分:0)
您可以为自己的经理编写模型(特别为formset)并使用它。
答案 2 :(得分:0)
在Django 3中,您应该使用formfield_for_foreignkey。
这是一个工作示例:
class CaracteristiqueInline(admin.TabularInline):
model = Caracteristique
formset = FiltreCaracteristiqueInline
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "id_Champ": # The FK in my table Caracteristique
kwargs["queryset"] = Champ.objects.filter(est_DC_Champ=False)
# Champ is the parent table of Caracteristique
# est_DC_Champ is a field of the table Champ
return super().formfield_for_foreignkey(db_field, request, **kwargs)
extra = 0
这样,在表格视图中,您的FK字段下拉列表中的选择将被过滤。