从管理员我看到您可以为用户或用户组分配权限,以便:允许添加,更改或删除模型中的数据。
这很好,但我还需要允许用户或用户组访问或不访问一组视图。我在我的网站上有某种类型的服务,所以我想允许一些用户访问某些服务(页面/视图)而不是其他用户。
那么我如何允许某些用户/用户组访问某些视图?谢谢!
答案 0 :(得分:23)
无法添加或更改某个型号的用户将无法在管理员中看到它。
如果我们谈论您自定义创建的视图,那么您可以创建一些检查用户权限的内容,如果他们没有该权限则返回404。权限与模型相关联,并且可以为组分配各种权限。
您可以为这样的模型添加权限:
# myproject/myapp/models.py
class MyModel(models.Model):
class Meta:
permissions = (
('permission_code', 'Friendly permission description'),
)
然后,您可以检查用户是否具有以下权限:
@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
# ...
使用权限,您只需使用管理界面即可轻松地在用户和组中添加或删除权限。
答案 1 :(得分:10)
您需要手动管理,但这很容易。据推测,有一个属性可以确定一个组是否有权查看视图:那么您只需使用permission_required
装饰器装饰该视图,如果这是一个关于用户是否具有特定权限的简单问题,或者{ {1}}如果它有点复杂:
user_passes_test
假设@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
...etc...
是User对象上的某种方法。
authentication docs非常全面。
答案 2 :(得分:2)
对于基于类的视图,您可以将UserPassesTestMixin
类继承到视图中并定义test_func
from django.contrib.auth.mixins import UserPassesTestMixin
class MainView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.has_perm('app.get_main_view')
请查看this docs了解有关如何使用此功能的更多详细信息:
答案 3 :(得分:1)
权限系统以模型为中心,并假定权限与模型相关联。我认为以下两种选择是最好的选择:
一个。如果您的视图与某些特定模型相关,请使用该模型的自定义权限,如Marcus Whybrow建议的那样。
B中。 [未经过测试,可能无效]子类User
并在那里定义您自己的权限。您不需要实际模型,它只是您的应用程序自定义权限的包装:
from django.contrib.auth.models import User
class MyUser(User):
class Meta:
permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))
不要忘记运行syncdb
向数据库添加自定义权限。
答案 4 :(得分:0)
如果您使用的是Django 1.9+,则应该可以使用Option Explicit
Sub CompareIt()
Dim ar As Variant
Dim arr As Variant
Dim Var As Variant
Dim v()
Dim i As Long
Dim n As Long
Dim j As Long
Dim str As String
ar = Sheet1.Cells(10, 1).CurrentRegion.Value
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
ReDim v(1 To UBound(ar, 2))
For i = 2 To UBound(ar, 1)
For n = 1 To UBound(ar, 2)
str = str & Chr(2) & ar(i, n)
v(n) = ar(i, n)
Next
.Item(str) = v: str = ""
Next
ar = Sheet2.Cells(10, 1).CurrentRegion.Resize(, UBound(v)).Value
For i = 2 To UBound(ar, 1)
For n = 1 To UBound(ar, 2)
str = str & Chr(2) & ar(i, n)
v(n) = ar(i, n)
Next
If .exists(str) Then
.Item(str) = Empty
Else
.Item(str) = v
End If
str = ""
Next
For Each arr In .keys
If IsEmpty(.Item(arr)) Then .Remove arr
Next
Var = .items: j = .Count
End With
With Sheet3.Range("a10").Resize(, UBound(ar, 2))
.CurrentRegion.ClearContents
.Value = ar
If j > 0 Then
.Offset(1).Resize(j).Value = Application.Transpose(Application.Transpose(Var))
End If
End With
Sheet3.Activate
End Sub
:https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.PermissionRequiredMixin