首页 > 解决方案 > 使用 django-rules 时来自 Django Admin 中谓词的 AttributeError

问题描述

我正在尝试使用django-rules创建第一个实现,遵循自述文件中的指南。

从一些基本概念开始,我想将记录的删除限制为仅在我的应用程序中的记录所有者contact。我设法(似乎)使用通过 Django REST Framework 提供的 API 来处理事情。但是,当我使用非超级用户打开 Django Admin 时,我收到以下错误:

AttributeError:“NoneType”对象没有属性“created_by”

这似乎与我的谓词定义有关contact/rules.py(我尝试遵循此处的 django-rules 文档中的“书籍示例” ):

import rules

@rules.predicate
def is_contact_owner(user, contact):
    return contact.created_by == user

@rules.predicate
def is_address_owner(user, address):
    return address.created_by == user


rules.add_perm("contact.view_contact", rules.is_staff)
rules.add_perm("contact.add_contact", rules.is_staff)
rules.add_perm("contact.change_contact", rules.is_staff)
rules.add_perm("contact.delete_contact", is_contact_owner)

rules.add_perm("contact.view_address", rules.is_staff)
rules.add_perm("contact.add_address", rules.is_staff)
rules.add_perm("contact.change_address", rules.is_staff)
rules.add_perm("contact.delete_address", is_address_owner)

我的contact/admin.py样子如下:

from django.contrib import admin
from rules.contrib.admin import ObjectPermissionsModelAdmin

# Register your models here.
from .models import Address, Contact


@admin.register(Address)
class AddressAdmin(ObjectPermissionsModelAdmin):
# class AddressAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "local_address",
        "country",
        "uuid",
        "created",
        "modified",
        "created_by",
        "modified_by",
    )
    date_hierarchy = "created"
    list_filter = ["created", "modified", "country"]


@admin.register(Contact)
class ContactAdmin(ObjectPermissionsModelAdmin):
# class ContactAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "last_name",
        "first_name",
        "date_of_birth",
        "uuid",
        "created",
        "modified",
        "created_by",
        "modified_by",
    )
    date_hierarchy = "created"
    list_filter = ["created", "modified"]

谁能给我指点一下这里可能会失败的地方?

标签: pythondjangodjango-rules

解决方案


所以在添加了一些日志之后,我发现我的谓词函数似乎在每个请求上都被执行,即使只需要检查查看权限。在管理员登录页面上观察到该错误,其中我想要检查created_by属性的对象还没有在上下文中。

这就引出了另一个问题:为什么每个请求都要检查谓词?-> 新帖子


推荐阅读