Django filter many to many field in admin?

20,491

Solution 1

There is a formfield_for_manytomany. Usage is similar to the answer given by defuz.

ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶

Like the formfield_for_foreignkey method, the formfield_for_manytomany method can be overridden to change the default formfield for a many to many field. For example, if an owner can own multiple cars and cars can belong to multiple owners – a many to many relationship – you could filter the Car foreign key field to only display the cars owned by the User:

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

Solution 2

Read the docs:

class BucketAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "things":
             kwargs["queryset"] = Things.objects.filter(...)
        return super(BucketAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Share:
20,491
Andrew
Author by

Andrew

Updated on October 04, 2020

Comments

  • Andrew
    Andrew over 3 years

    I have three objects:

    Thing
      some fields
    
    Bucket
      things = models.ManyToManyField(Thing)
    
    User
      buckets = models.ManyToManyField(Bucket)
      things = models.ManyToManyField(Thing)
    

    When editing my "Bucket" field in the admin, I want to be able to select Things, but only those things that are in the "Things" list on the user currently logged in.

    How can I do that? In other words, how can I filter the list of Things in the Bucket admin?

    Thank you very much for your help in advance.