管理者インターフェースを機能させるのに本当に問題があります。モデルがあり、そのモデル内にグループ化する m2m フィールドがあります。
from django.contrib.auth.models import Group
class Lecture(models.Model):
....
allowed_groups = models.ManyToManyField(Group)
....
ここで、モデルを保存するときに、これらのグループに特別な表示権限を与えて、それらのグループのメンバーだけがそのモデルのオブジェクトを表示できるようにします。オブジェクトごとのアクセス許可にdjango-guardianを使用しています。したがって、私のモデルの保存方法では、次のようなことを行います。
def save(self, *args, **kwargs):
allGroups = Group.objects.all()
super(Lecture, self).save(*args, **kwargs)
groups = self.allowed_groups.all()
viewright = 'view_lecture'
for ag in allGroups:
if ag in groups:
assign_perm(viewright, ag, self) #assign_perm comes from guardian
else:
remove_perm(viewright, ag, self) #remove_perm comes from guardian
また、post_save シグナルを使用しようとしましたが、問題は、変更を行うために管理者インターフェースの保存ボタンを常に 2 回押していることです(グループは常に正しい方法で追加されますが、アクセス許可は追加されるだけです)。 2 回目は、管理インターフェイスの [保存] ボタンを使用してモデルを保存します) では、ここで何が行われているのでしょうか? 誰でも助けることができますか?
- - 編集 - -
私の解決策: 次のように、permission-assignment-code を ModelAdmin クラスに移動しました。
admin.py
class LectureAdmin(admin.ModelAdmin):
def save_model(self, request, lecture, form, change):
if not lecture.id:
lecture.owner = request.user
super(LectureAdmin, self).save_model(request, lecture, form, change)
allGroups = Group.objects.all()
groups = form.cleaned_data['allowed_groups']
viewright = 'cms.view_lecture'
for ag in allGroups:
if ag in groups:
assign_perm(viewright, ag, lecture)
else:
remove_perm(viewright, ag, lecture)