Django Admin: Show only some objects in ManyToMany field?

Viewed 1345

I have relatively simple data model with User, Group and Task. Each group has its own tasks and users. Users can be only assigned to one group.

Tasks belong to groups and each task has manyToMany field for users, so multiple users can have the same task assigned.

In my admin when assigning users to task it shows all created users, I want it to only show users from the same group as the task.

What would be the best approach?

I have checked available customization options for admin.ModelAdmin but haven't found anything related to my problem.

2 Answers

you can use formfield_for_manytomany

the formfield_for_manytomany method can be overridden to change the default formfield for a many to many field

in your case change your admin.py to :

class TaskAdmin(admin.ModelAdmin):

    def get_object(self, request, object_id, s):
        # Hook obj for use in formfield_for_manytomany
        self.obj = super(TaskAdmin, self).get_object(request, object_id)
        # print ("Got object:", self.obj)
        return self.obj


    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "user":
            kwargs["queryset"] = User.objects.filter(task=self.obj)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Task, TaskAdmin)

You can customize the model admin using a method: formfield_for_manytomany

class TaskAdmin(admin.ModelAdmin):

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "users":
            # Filter your users below as per your condition
            kwargs["queryset"] = Users.objects.filter()
        return super(TaskAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
Related