2016-09-14 159 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方式!希望它有助於或給你一個想法