我有一个多语言的Django项目.每种语言都是不同的子域.
因此,我们决定使用“站点”应用程序,并为每种语言创建一个不同的站点.
在该项目上,我还有一个“页面”应用程序,与CMS非常相似.用户可以创建包含内容的页面,并将它们显示在适当的语言站点中.
现在,我希望能够管理高级权限.我需要做的是允许管理员在管理应用程序中只为一种(或多种)特定语言/站点创建和更新页面.
做这样的事情更干净的方法是什么?
编辑:这是克里斯适应的解决方案
我创建了一个装饰器,用于检查用户是否在可以访问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