2016-09-14 2 views
4

Как добавить пользователей в группу в Django-интерфейс администратора «Change Group»?Django: Добавить пользователя в группу через Django Admin

Я видел грязные хаки, чтобы это работало для более старой версии django.

Как это решить с помощью Django 1.10?

Подчеркните: Я хочу это на странице «Изменить группу», а не на «Изменить пользователя».

Я хотел бы иметь это в стиле django-admin: нет кодирования, просто выполняю некоторую конфигурацию. Может быть, как это:

class GroupAdmin(admin.ModelAdmin): 
    show_reverse_many_to_many = ('user',) 

ответ

7

Вам необходимо написать код. Обратите внимание, что административный сайт Django является обычным видом и формами Django!

Сначала создайте ModelForm:

from django import forms 
from django.contrib import admin 
from django.contrib.auth import get_user_model 
from django.contrib.admin.widgets import FilteredSelectMultiple  
from django.contrib.auth.models import Group 


User = get_user_model() 


# Create ModelForm based on the Group model. 
class GroupAdminForm(forms.ModelForm): 
    class Meta: 
     model = Group 
     exclude = [] 

    # Add the users field. 
    users = forms.ModelMultipleChoiceField(
     queryset=User.objects.all(), 
     required=False, 
     # Use the pretty 'filter_horizontal widget'. 
     widget=FilteredSelectMultiple('users', False) 
    ) 

    def __init__(self, *args, **kwargs): 
     # Do the normal form initialisation. 
     super(GroupAdminForm, self).__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): 
     # Add the users to the Group. 
     self.instance.user_set = self.cleaned_data['users'] 

    def save(self, *args, **kwargs): 
     # Default save 
     instance = super(GroupAdminForm, self).save() 
     # Save many-to-many data 
     self.save_m2m() 
     return instance 

Мы добавили пользовательские группы ModelForm. Второй шаг заключается в разрегистрировать оригинальную группу администраторов и зарегистрировать новую группу администраторов, которая отображает нашу ModelForm:

# Unregister the original Group admin. 
admin.site.unregister(Group) 

# Create a new Group admin. 
class GroupAdmin(admin.ModelAdmin): 
    # Use our custom form. 
    form = GroupAdminForm 
    # Filter permissions horizontal as well. 
    filter_horizontal = ['permissions'] 

# Register the new Group ModelAdmin. 
admin.site.register(Group, GroupAdmin) 

Screenshot Django custom form and filter_horizontal in Group admin

+0

прекрасно работает. Спасибо. – guettli

+0

Отсутствует импорт: из django.contrib.admin.widgets import FilteredSelectMultiple – jocassid

+0

При попытке этого я нашел, что он не работает, и он не должен соответствовать https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/# the-save-method - вы должны вызвать parent save с commit = True, а затем сохранить данные «многие-ко-многим» в методе save_m2m. –

0

На странице группы по изменению вы должны переопределить форму изменения группы и добавить несколько переключателя с пользователями

1

Вы должны написать код, чтобы достичь того, чего вы хотите, так как Джанго администратор обеспечивает измените форму для модели, в которой есть поле M2M, а именно User, так как m2m до Group находится внутри этой модели.

Так что, в основном, делая это полностью в администраторе django и приятно, вам, вероятно, нужно переопределить несколько функций и обеспечить собственную реализацию.

class GroupForm(forms.Form): 
    blah 
    users = forms.ModelMultipleChoiceField(
     label=_('Users'), required=False, queryset=User.objects.all(), 
     widget=FilteredSelectMultiple(is_stacked=True, verbose_name=_('Users')),help_text=mark_safe("Help text") 
    ) 

class GroupAdmin(BaseAdmin): 
    form = GroupForm 
    # you can here define fieldsets to render your form more beautifully 

    def save_related(self, request, form, formsets, change): 
     current_group = form.instance 
     # .... 
     # Update relations between users and the group here, both are 
     # accessible with the form instance 

    def get_changeform_initial_data(self, request): 
     # If you want to render the form with initial data for the user 
     # you may optionally override this method as well. 
     initial = super(GroupAdmin, self).get_changeform_initial_data(request) 
     initial.update({'users': ...}) 
     return initial 

Это самый способ, который я нахожу, чтобы реализовать то, что вы хотите! Надеюсь, это поможет или даст вам идею

Смежные вопросы