python - How to add object level permission in django admin
问题描述
I have a Building
model and in that i have a field notes
which has GenericRelation
to GeneralNote
. In Building
admin added GeneralNotes
as Inlines. Now I want that the GeneralNotes
is editable for the user who is owner of general note.
class Building(TimeStampedModel):
name = models.CharField( unique=True, max_length=100, verbose_name=_("Building Name"), help_text=_("This is the name of your building")
)
notes = GenericRelation(GeneralNote)
class GeneralNote(TimeStampedModel):
owner = models.ForeignKey(
CompanyEmployee,
blank=True,
null=True,
# related_name='noteOwner',
on_delete=models.SET_NULL,
verbose_name="Note Owner",
)
content = models.TextField(max_length=400, null=True )
date_of_action = models.DateField(null=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
attached_to = GenericForeignKey()
In admin.py
:
class BuildingAdmin(ImportMixin, GeneralNotesIncludedAdmin):
inlines = (GeneralNoteInLine,)
class GeneralNotesIncludedAdmin(CoreBaseAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
if not instance.owner:
instance.owner = request.user.companyemployee
instance.save()
super().save_formset(request, form, formset, change)
class CoreBaseAdmin(admin.ModelAdmin):
save_on_top = True
解决方案
您可以使用以下has_change_permission
方法:
class GeneralNotesIncludedAdmin(CoreBaseAdmin):
def has_change_permission(self, request, obj=None):
if obj is None:
return True
return obj.owner == request.user.companyemployee
您还可以将这些添加到InlineModelAdmin
:
class GeneralNoteInLine(InlineModelAdmin):
def has_change_permission(self, request, obj=None):
if obj is None:
return True
return obj.owner == request.user.companyemployee
推荐阅读
- mysql - 如何使用 3 个不同的表查询 SQL 数据库,其中包含有关演员、戏剧和所执行角色的信息?
- php - 有没有办法用 Lumen/Laravel PHP 创建一个 tsv 响应?
- python - 安装 Pytorch XLA 后出现“Numpy 不可用”
- java - 在应用程序未运行时检测 dataChange
- serialization - 在flink(scala)中使用kryo在某种类型上注册protobuf序列化程序时出现问题
- gis - “通过所有基础”标准如何在 SpatialFIlter 中工作。在FME?
- c# - 如何在运行时为嵌套属性构建类映射
- javascript - 如何使用嵌套循环 (.each) 在 Cypress 中迭代 HTML 表
- mysql - 在 Mysql 中,以前的用户在 droppng 并创建同名后可以访问数据库
- c# - 按键输入后需要循环