Python Django(守护者): editing data depending on an m2m-field in my model

标签 python django m2m django-guardian

我在管理界面工作方面确实遇到了麻烦。我有一个模型,在该模型内有一个要分组的 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 方法中执行此操作。造成这种情况的原因是因为模型 admin adds a save_m2m method to your model form在模型表单上调用save后调用它,将m2m关系设置为表单中的选择(第一次保存时其值可能为空)。

关于Python Django(守护者): editing data depending on an m2m-field in my model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833239/

相关文章:

python - 覆盖测试 Django Rest Framework 的工具

python - 如何在不加载固定装置的情况下运行 syncdb?

python、Django 与使用 urllib2 发送 pdf 相关

python - Django Many2many 是另一个集合的子集

我们可以在 BG96 LwM2M 实现中添加自定义对象吗?

python - 为什么从 Paste 应用程序中创建 neo4j.GraphDatabase 会导致段错误?

Python OpenCV imshow() 函数未实现

python - Redis 过期通知和 Flask

django - 加快 django 中的 postgis 查询

json - Django Rest Framework - M2M 通过