我有一个多语言的Django项目。每种语言都是不同的子域名。 因此,我们决定使用“网站”应用程序,并为每种语言创建一个不同的网站。
在该项目中,我还有一个“页面”应用程序,它与CMS非常相似。用户可以创建包含内容的页面,它们将显示在相应的语言站点中。
现在我希望能够管理高级权限。我需要做的是在管理应用程序中允许用户仅为一个(或多个)特定语言/站点创建和更新页面。
做那样的事情的干净方法是什么?
编辑:这是我改编的解决方案,由Chris提供
我创建了一个装饰器,用于检查用户是否在有权访问lang的组中。 有关此示例,请参阅克里斯接受的答案。
在“普通”视图中,我执行以下操作:
def view(self):
# Whatever you wanna do
return render_to_response('page.html', {}, RequestContext(request))
view = group_required(view)
如果用户在组中,它将返回该方法。否则,它将返回“拒绝访问”错误。
在我的管理员中,我会执行以下操作:
class PageAdmin(admin.ModelAdmin):
list_display = ('title', 'published')
fieldsets = [
(None, {'fields': ['title', 'slug', 'whatever_field_you_have']}),
]
def has_add_permission(self, request):
return in_group_required(request)
admin.site.register(Page, PageAdmin)
其中in_group_required是与上面提到的group_required类似的方法。但是,根据我们是否有访问权限,只会返回true或false。
因为我们在前面的例子中使用了它们,所以你可以在上面找到我在in_group和group_required方法中的内容。
def group_required(func):
def _decorator(request, *args, **kwargs):
if not in_group(request):
return HttpResponse("Access denied")
return func(*args, **kwargs)
return _decorator
def in_group(request):
language = Language.objects.get(site__domain__exact=request.get_host())
for group in language.group.all():
if request.user in group.user_set.all():
return True
return False
答案 0 :(得分:3)
您可以创建一个组(http://docs.djangoproject.com/en/dev/topics/auth/) 每个站点/语言,并相应地将用户添加到组。
然后,您可以检查request.user.groups是否属于该组。 (您可以使用装饰器执行此操作:
def group_required(func):
def _decorator(request, *args, **kwargs):
hostname = request.META.get('HTTP_HOST')
lang = hostname.split(".")[0]
if not lang in request.user.groups:
return HttpResponse("Access denied")
return func(*args, **kwargs)
return _decorator
(纠正/修改代码以符合您的要求......)
答案 1 :(得分:1)
您可以在ModelAdmin类中覆盖has_add_permission(和相关方法)。 (使用类似的代码如上所示)
答案 2 :(得分:0)
如果要过滤页面应用程序的管理索引上的Page对象, 您可以在ModelAdmin中覆盖方法queryset()。 此QuerySet仅返回属于站点(因此为组)的Page对象 其中request.user是其成员。
Pages.objects.filter(site__name__in=request.user.groups)