Django授权的自定义权限

时间:2016-10-07 07:49:49

标签: django django-models erp django-permissions

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

#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中是否有一个权限系统,其中一个用户可以创建一个对象但不能授权,而另一个用户 - 谁拥有权限 - 可以授权?如果没有,唯一的方法是在用户模型中创建自定义字段并每次检查它吗?

2 个答案:

答案 0 :(得分:0)

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

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

models.py

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

并运行python manage.py migrate以使用代号"see_document"创建新的Permission对象。

您可以在视图处理的请求中实现权限,如下所示:

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'

这可以将没有permssion的任何用户重定向到权限被拒绝页面。有关详细信息,请参阅此https://docs.djangoproject.com/en/1.10/topics/auth/

答案 1 :(得分:0)

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

您可以通过在 admin.py 中提供自定义ModelAmin课程来实现这一目标:

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等。

<强>更新

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