授权的Django自定义权限

Django Custom Permission for Authorization

我正在开发一个 Django 项目,其中一个模型(比方说文档)具有以下字段:

#In models.py

class Document (models.Model):
    choice = (('Yes','Yes'), ('No','No'))
    authorized = models.CharField (max_length=3, choices=choice, default='No')

现在普通用户创建一个Document对象,授权字段是no。但是,在真正批准之前,需要上级授权。现在,在 django 中是否有一个权限系统,一个用户可以创建一个对象但不能授权,而其他一些拥有权限的用户可以授权?如果没有,唯一的方法是在用户模型中创建一个自定义字段并每次都检查它吗?

Django 有很棒的授权系统。我无法理解你的场景。 但是你可以在下面尝试这样的事情 默认情况下,每个 Model 对象都带有三个 Permission 对象,例如(在您的情况下为 add_document、change_document 和 delete_document)。 如果你想要一些自定义权限,你可以像这样在模型 Meta class 中添加它:

您可以将这些权限添加到用户对象或组对象。

models.py

class Document (models.Model):
    ######
    class Meta:
        permissions = (("Can see document dashbaord", "see_document" ),)

和 运行 python manage.py migrate 创建代号为 "see_document" 的新权限对象。

您可以像这样在视图处理的请求中实现权限:

view.py

from django.contrib.auth.mixins import PermissionRequiredMixin, permission_required

# For function based view
@pemission_required('document.see_document')
def someview(request):
    ######
    pass

# For class based views
class SomeView(PermissionRequiredMixin, BaseView):

    permission_required = 'document.see_document'

这可以将任何没有权限的用户重定向到权限被拒绝的页面。要了解更多信息,请阅读 https://docs.djangoproject.com/en/1.10/topics/auth/

首先,为什么需要将可能的值存储在 CharField 而不是 BooleanField 中?我认为您应该考虑更改为 BooleanField.

您可以通过在 admin.py:

中提供自定义 ModelAmin class 来做到这一点
from django.contrib import admin
from .models import Document

@admin.register(Document)
class DocumentModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if not request.user.is_superuser:
            self.exclude = ['authorized']
        return super(DocumentModelAdmin, self).get_form(request, obj, **kwargs)

所以现在在 Document 的管理页面上,如果不是超级用户,用户将看不到 authorized 字段。您可以更改该代码以检查它是否应该是特定用户,或者是否具有某些权限,或者用户是否属于某些 Group

更新

如果你希望它在一般视图中,你可以将不同的表单传递给用户,具体取决于他们的角色|权限|组(我不知道你所谓的高级 与其他用户不同)。所以答案是:创建两个表单,然后根据您的 request.user 属性在模板中传递它们。