2016-09-14 158 views
4

如何将用户添加到“Change Group”的Django管理界面中的组?Django:通过Django将用户添加到组管理

我已经看到肮脏的黑客得到这个更老的django版本工作。

如何用Django 1.10解决这个问题?

强调:我希望在页面上的“更改组”,而不是“更改用户”。

我想在django-admin-style中有这个:没有编码,只是做一些配置。也许是这样的:

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

Missing import:from django.contrib.admin.widgets import FilteredSelectMultiple – jocassid

+0

尝试这个时,我发现它不起作用,它不应该根据https://docs.djangoproject.com/en/1.11/topics/forms/modelforms /#the-save-method - 您应该使用commit = True调用父保存,然后将save-m2m方法中的多对多数据保存。 –

0

在更改群组页面,你必须覆盖变化组表单并添加多个选择框与用户

1

你必须写代码来实现你想要的,因为Django管理提供对于具有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 

这是我发现实现你想要的最django-ic方式!希望它有助于或给你一个想法