Django admin, filter objects for inline formset

In Django 3, you should use formfield_for_foreignkey.

here is a working example :

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

With this, in your Tabular View, the choices in the dropdown of your FK Field will be filtered.


You can write your own manager to you model (special for formset) and use it.

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


Replying to own question may seem a bit odd but I found another solution ;)

There was a problem to provide custom queryset to a formset, there is no hook in case of inline formsets for this. So I subclassed BaseInlineFormSet and overridden the get_queryset method. Then I just provide this formset in InlineModelAdmin and it's done.

Example:

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

and admin class:

class MyInline(admin.TabularInline):
    model = m.MyModel
    formset =  MyFormSet
    ...