在Django3.0中设置objectlevel权限

2024-04-25 19:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个带有cms占位符的模型:

class Content(models.Model):
    placeholder = PlaceholderField('placeholder')
    published = models.BooleanField(default=False)

我想使占位符前端可编辑,这取决于它是否已发布。i、 我希望它可以通过前端编辑,只要它是未发布的,但一旦占位符已经发布,我希望它是不可编辑的。你知道吗

我试过以下方法管理员.py地址:

class ContentAdmin(admin.ModelAdmin):
    def has_change_permission(self, request, obj=None):
        if obj.published:
            return False
        else:
            return True

admin.site.register(Content, ContentAdmin)

但似乎没有任何效果。我也尝试过使用自定义后端。你知道吗

def has_perm(self, user_obj, perm, obj=None):
        if isinstance(obj, Content):
            if obj.published:
                return False
            else:    
                return True
        return False

而且,没有效果。我没有得到任何错误,但占位符继续呈现为可编辑。我做错什么了?我目前正在和管理员一起测试,是不是我不能拒绝超级用户权限?你知道吗

使用django 1.6.1和django cms 3.0.12

谢谢!你知道吗


Tags: falseobj编辑returnifcmsadminmodels
1条回答
网友
1楼 · 发布于 2024-04-25 19:29:34

您可以重写ContentAdmin中的get_readonly_fields,以检查内容对象是否已发布,并相应地将placeholder设置为只读。你知道吗

def get_readonly_fields(self, request, obj=None):
    if obj and obj.published:
        return ('placeholder')
    return ()

更新

admin readonly只影响Django admin。你知道吗

您可以override the model's ^{} method并检查placeholder是否是更新字段之一。如果是,并且Content实例已发布,它将什么也不做。你知道吗

def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
    if self.published and 'placeholder' in update_fields:
        return
    super(Content, self).save(force_insert=force_insert,
        force_update=force_update, using=using, update_fields=update_fields)

这将忽略提供给前端中placeholder字段的任何新值。你知道吗

在前端,您可以保持原样,只需进行此更改。(该字段仍将显示为可编辑,尽管编辑不会产生任何影响)。你知道吗

否则,您可以修改render_placeholder(我假设它是一个自定义标记)来检查Content对象的published字段,并将要呈现的输入设置为disabled。你知道吗

它看起来像这样

{% if obj.published %}
    Placeholder: <input disabled type="text" name="placeholder">
{% else %}
    Placeholder <input type="text" name="placeholder">
{% endif %}

相关问题 更多 >