Django admin,过滤内联formset的对象

时间:2010-01-20 14:25:19

标签: django django-admin django-forms

我有一个内联formset,我想排除一些模型对象在formset中显示。

例如。模型B具有模型A的外键,因此它是1:n(一个对象有很多B对象)的关系。现在在一个管理编辑页面上,我有了B的内联。我想知道是否有可能以某种方式在呈现内联formset之前过滤B对象列表,因此并非所有与B对象相关的A都会进入formset。

3 个答案:

答案 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)并使用它。

http://docs.djangoproject.com/en/dev/topics/db/managers/

答案 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字段下拉列表中的选择将被过滤。