Skip to content

Instantly share code, notes, and snippets.

@Tobiaqs
Created March 9, 2026 13:11
Show Gist options
  • Select an option

  • Save Tobiaqs/ab3a0cd19b836d4d593bb40569f8ffe4 to your computer and use it in GitHub Desktop.

Select an option

Save Tobiaqs/ab3a0cd19b836d4d593bb40569f8ffe4 to your computer and use it in GitHub Desktop.
How to get a fancy FilteredSelectMultiple many-to-many admin field in Django
from django import forms
from django.contrib import admin
from django.contrib.admin import widgets
class GroupAdminForm(forms.ModelForm):
users = forms.ModelMultipleChoiceField(
queryset=models.User.objects.all().order_by("username"),
required=False,
# Use the pretty 'filter_horizontal widget'.
widget=widgets.RelatedFieldWidgetWrapper(
widgets.FilteredSelectMultiple("users", False),
models.UserGroup._meta.get_field("user"),
admin.site,
# Avoid problem where it tries to resolve auth_group_add, even though in our case it's auth_usergroup_add
can_add_related=False,
),
label="Users",
)
tenants = forms.ModelMultipleChoiceField(
queryset=models.Tenant.objects.all(),
required=False,
# Use the pretty 'filter_horizontal widget'.
widget=widgets.RelatedFieldWidgetWrapper(
widgets.FilteredSelectMultiple("tenants", False),
models.UserGroup._meta.get_field("tenants").remote_field,
admin.site,
),
label="Tenants",
)
def __init__(self, *args, **kwargs):
# Do the normal form initialisation.
super().__init__(*args, **kwargs)
# If it is an existing group (saved objects have a pk).
if self.instance.pk:
# Populate the users field with the current Group users.
self.fields["users"].initial = self.instance.user_set.all()
def save_m2m(self):
self.instance.user_set.set(self.cleaned_data["users"])
def save(self, *args, **kwargs):
# Default save
instance = super().save()
# Save many-to-many data
self.save_m2m()
return instance
class Meta:
model = models.UserGroup
fields = "__all__"
@admin.register(models.UserGroup)
class GroupAdmin(DjangoGroupAdmin):
form = GroupAdminForm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment