2016-09-14 4 views
4

Djangoの管理インターフェースの "Change Group"にグループを追加するにはどうしたらいいですか?Django:Django Admin経由でグループに追加するユーザ

私は古いdjangoバージョンでこれを動作させるために汚れたハックを見ました。

これをDjango 1.10で解決する方法は?

強調:「Change User」ではなく、「Change Group」ページでこれを使用します。

私は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

欠落しているインポート:django.contrib.admin.widgetsからインポートFilteredSelectMultiple – jocassid

+0

これを試している間、私はそれが動作しないことを発見し、それはhttps://docs.djangoproject.com/en/1.11/topics/forms/modelformsに従ってはいけません/#the-save-method - 親saveを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 

これは、私があなたが望むものを実現するために最も見いだされた方法です。それが助けてくれるといいと思います。

関連する問題