1

管理者インターフェースを機能させるのに本当に問題があります。モデルがあり、そのモデル内にグループ化する 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) 
4

1 に答える 1