授权的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
属性在模板中传递它们。
我正在开发一个 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
属性在模板中传递它们。