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