7

ユーザー オブジェクト (ユーザーの編集) のデフォルトの Django 管理ビューでは、ユーザーのグループ メンバーシップを編集できます。これを逆にしたい場合はどうなりますか?つまり、グループ編集ページでは、編集中のグループに属するユーザーを選択できます。

これを見ると、Django には Group から User オブジェクトへの ManyToMany マッピングがないため、この特定のケースで ModelAdmin クラスを実装することは不可能 (?) になっています。追加の UsersOfGroup モデル クラスを作成し、それを Django の Group モデルの ManyToMany フィールドでスルー属性として使用できれば、方法はあるでしょう。

ModelAdmin のトリックを使用してこれを実装することは可能ですか、それともグループを編集するためのカスタム ビューを作成する必要がありますか?

これらの他の2つの質問を確認しましたが、まったく同じことをしていません:

管理者にユーザーを追加しながらグループを割り当てる

グループ メンバーシップを管理画面に表示する

更新: Chris からの回答はほとんどありませんでした。:) グループには users セットへの参照がありますが、usersではなくuser_setと呼ばれます。だから、これらは私が行った変更です:

if self.instance and self.instance.pk:
    self.fields['users'].initial = self.instance.user_set.all()

if group.pk:
    group.user_set = self.cleaned_data['users']
4

4 に答える 4

4

新しいグループを追加し、同時にユーザーをグループに追加する場合、上記の保存方法は機能しません。問題は、新しいグループが保存されず (管理者は commit=False を使用)、主キーがないことです。save_m2m() の目的は、呼び出しビューが m2m オブジェクトの保存を処理できるようにすることなので、古い save_m2m メソッドを新しいメソッドでラップする保存オブジェクトを作成しました。

def save(self, commit=True):
    group = super(GroupAdminForm, self).save(commit=commit)

    if commit:
        group.user_set = self.cleaned_data['users']
    else:
        old_save_m2m = self.save_m2m
        def new_save_m2m():
            old_save_m2m()
            group.user_set = self.cleaned_data['users']
        self.save_m2m = new_save_m2m
    return group
于 2011-06-02T17:07:10.090 に答える
3

yourapp/admin.py

from django import forms
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import FilteredSelectMultiple

from django.contrib.auth.models import User, Group

class GroupAdminForm(forms.ModelForm):
    users = forms.ModelMultipleChoiceField(
        queryset=User.objects.all(), 
        required=False,
        widget=FilteredSelectMultiple(
            verbose_name=_('Users'),
            is_stacked=False
        )
    )

    class Meta:
        model = Group

    def __init__(self, *args, **kwargs):
        super(GroupAdminForm, self).__init__(*args, **kwargs)

        if self.instance and self.instance.pk:
            self.fields['users'].initial = self.instance.users.all()

    def save(self, commit=True):
        group = super(GroupAdminForm, self).save(commit=False)

        if commit:
            group.save()

        if group.pk:
            group.users = self.cleaned_data['users']
            self.save_m2m()

        return group

class GroupAdmin(admin.ModelAdmin):
    form = GroupAdminForm

admin.site.unregister(Group)
admin.site.register(Group, GroupAdmin)
于 2011-05-23T15:27:17.757 に答える