使用post_save信号分配用户权限

时间:2016-05-10 22:08:30

标签: django django-authentication django-signals

我有一个名为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()

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

1 个答案:

答案 0 :(得分:0)

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

所以我开始研究这个问题,并在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重写权限

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

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

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)

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