Python Django(Guardian):根据我的模型中的m2m字段编辑数据



我真的在让我的管理员界面工作时遇到了麻烦。我有一个模型,在该模型中有一个 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信号,但问题是,我总是在我的管理界面中按两次保存按钮来进行任何更改(组总是以正确的方式添加,但权限仅在第二次通过管理界面中的保存按钮保存模型时添加)那么这是怎么回事?有人可以帮忙吗?

---编辑---

我的

解决方案:我将权限分配代码移动到我的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) 
您需要

在管理窗体上定义一个save_m2m方法,并在那里执行自定义关系构建,而不是尝试在模型的保存方法中执行此操作。这样做的原因是,模型管理员向模型窗体添加了一个save_m2m方法,并在对模型窗体调用save调用该方法,将 m2m 关系设置为窗体中的选择(其值在第一次保存时可能为空)。

相关内容

  • 没有找到相关文章

最新更新