Django Admin Form for Many to many relationship

前端 未结 4 1306
无人共我
无人共我 2020-12-24 08:15

I have a many to many relationship between 2 tables Users an Domains. I have defined this relationship in the Domains class. So in the admin interface I see the Users when

4条回答
  •  孤独总比滥情好
    2020-12-24 08:29

    The only built-in way is via an InlineModelAdmin, but you can use a custom ModelForm with your User ModelAdmin to create field for this purpose. See the code below for simplified setup (assumes users = ManyToManyField(related_name='domains')).

    ### yourapp/admin.py ###
    
    from django import forms
    from django.contrib import admin
    from django.contrib.auth.models import User
    from django.utils.translation import ugettext_lazy as _
    from django.contrib.admin.widgets import FilteredSelectMultiple
    
    from .models import Domain
    
    class DomainAdmin(admin.ModelAdmin):
        filter_horizonal = ('users',)
    
    class UserAdminForm(forms.ModelForm):
        domains = forms.ModelMultipleChoiceField(
            queryset=Domain.objects.all(), 
            required=False,
            widget=FilteredSelectMultiple(
                verbose_name=_('Domains'),
                is_stacked=False
            )
        )
    
        class Meta:
            model = User
    
        def __init__(self, *args, **kwargs):
            super(UserAdminForm, self).__init__(*args, **kwargs)
    
            if self.instance:
              self.fields['domains'].initial = self.instance.domains.all()
    
        def save(self, commit=True):
            user = super(UserAdminForm, self).save(commit=False)
    
            user.domains = self.cleaned_data['domains']
    
            if commit:
                user.save()
                user.save_m2m()
    
            return user
    
    class UserAdmin(admin.ModelAdmin):
        form = UserAdminForm
    
    admin.site.register(Domain, DomainAdmin)
    admin.site.unregister(User)
    admin.site.register(User, UserAdmin)
    

提交回复
热议问题