Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Apparently this is an <a href="https://code.djangoproject.com/ticket/897" rel="nofollow noreferrer">8 year old feature request</a>. There is <a href="https://github.com/kux/django-admin-extend#bidirectional-many-to-many-fields" rel="nofollow noreferrer">django-admin-extend</a>. Or you could just throw something <a href="https://stackoverflow.com/a/4323813/538471">like this in there</a>:</p> <pre><code>from django.contrib import admin as admin_module class SiteForm(ModelForm): user_profiles = forms.ModelMultipleChoiceField( label='Users granted access', queryset=UserProfile.objects.all(), required=False, help_text='Admin users (who can access everything) not listed separately', widget=admin_module.widgets.FilteredSelectMultiple('user profiles', False)) class SiteAdmin(admin_module.ModelAdmin): fields = ('user_profiles',) def save_model(self, request, obj, form, change): # save without m2m field (can't save them until obj has id) super(SiteAdmin, self).save_model(request, obj, form, change) # if that worked, deal with m2m field obj.user_profiles.clear() for user_profile in form.cleaned_data['user_profiles']: obj.user_profiles.add(user_profile) def get_form(self, request, obj=None, **kwargs): if obj: self.form.base_fields['user_profiles'].initial = [ o.pk for o in obj.userprofile_set.all() ] else: self.form.base_fields['user_profiles'].initial = [] return super(SiteAdmin, self).get_form(request, obj, **kwargs) </code></pre> <p>It should give you a <code>filter_horizontal</code> when you specify it in the <code>fields</code> tuple.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload