【问题标题】:Assigning user permissions with post_save signal使用 post_save 信号分配用户权限
【发布时间】:2016-05-10 22:08:30
【问题描述】:

我有一个名为EmailUser 的自定义用户模型,我正在尝试在post_save 上分配自定义模型权限。我在models.py中有以下信号

@receiver(post_save, sender=EmailUser)
def assign_permissions(sender, **kwargs):
    emailUser = kwargs["instance"]
    if kwargs["created"]:
        permission = Permission.objects.get(name='Can view polls')
        emailUser.user_permissions.add(permission)
        print emailUser.user_permissions.all()

打印语句返回预期的:[<Permission: polls | poll | Can view polls>] 但是当我在 admin 中查看用户时,未选择权限,当我在 shell 中检查时,权限为空。

【问题讨论】:

  • 在给用户添加权限之前可以试试emailUser.save()
  • @pythonista:刚刚试过。完全相同的行为。
  • @oppositeday 你找到解决方案了吗?我也有类似的问题。
  • @newdimension:很遗憾,没有。我最终不得不使用一种解决方法。

标签: django django-authentication django-signals


【解决方案1】:

我遇到了完全相同的问题,我尝试在admin.py文件中使用post_save|pre_save|重新定义save()模型方法|重新定义model_save()方法,但我没有得到预期的行为(在管理界面中看不到选定的权限)

于是我开始调查这个问题,发现在django.contrib.admin.options文件,ModelAdmin类,_changeform_view方法下一个代码:

self.save_model(request, new_object, form, not add)
self.save_related(request, form, formsets, not add)

所以首先实例由save_model保存,然后权限由save_related重写

所以我只是在我的UserAdmin 类中重新定义了changeform_view

下一个是我重新定义的代码清单:

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):

        to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR))
        obj = self.get_object(request, unquote(object_id), to_field)
        user = get_object_or_404(User, id=obj.id)
        if user.is_lab_director:
            permission = Permission.objects.get(name='Can change job')
            user.user_permissions.add(permission)
        else:
            user.user_permissions.clear()

        with transaction.atomic(using=router.db_for_write(self.model)):
            return self._changeform_view(request, object_id, form_url, extra_context)

我希望这可以帮助某人解决此类问题

【讨论】:

  • 对不起,你如何使用 save_related?在我的代码中,管理员创建员工用户后,我必须根据业务规则设置权限。我的代码dpaste.org/Ccds
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2017-04-06
  • 2017-05-12
  • 1970-01-01
  • 2017-10-10
  • 2021-11-26
相关资源
最近更新 更多