python - 使用 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"]
谁能给我指点一下这里可能会失败的地方?
解决方案
所以在添加了一些日志之后,我发现我的谓词函数似乎在每个请求上都被执行,即使只需要检查查看权限。在管理员登录页面上观察到该错误,其中我想要检查created_by
属性的对象还没有在上下文中。
这就引出了另一个问题:为什么每个请求都要检查谓词?-> 新帖子
推荐阅读
- javascript - 如何以 xlsx 角度格式化单元格标题
- python - 我想用 openpyxl 让我的 excel 文件快速读写
- ios - 如何动态更改 UILabel 的宽度?
- sql-server-2016 - AccountNo 的 DENSE_RANK 或 ROW 不太正确
- magento-1.8 - catalogsearch_query 确实有一个 STRING 条目。为什么 STRING 上的前端搜索不会出现?
- android - android中的KeyAggrement不接受ECPrivatekey
- python - 通过 curl 将变量传递给 Flask 端点
- git - 在 git commit 期间固定光标位置
- apache-spark-mllib - 如何使用 Java 中的 Evaluators 使用 org.apache.spark 在 PMML 上评分?
- oauth - Google OAuth 验证,无法添加敏感/受限范围