Reputation: 3999
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.
Upvotes: 36
Views: 26380
Reputation: 27621
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)
Upvotes: 32
Reputation: 34133
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, theformfield_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)
Upvotes: 50