我想编写一个上下文处理器,它将查看现有的上下文,如果存在表单,请检查用户是否有权编辑该对象。如果没有,我将覆盖该上下文变量。
如何从上下文处理器中读取现有上下文?
编辑: 使用这种类型的上下文处理器的原因是为了避免在每个视图中使用if语句检查权限。某些用户将具有读/写访问权限,其他用户将具有只读权限,而其他用户将无权访问对象级别。我希望在处理完视图后相应地操作表单。
答案 0 :(得分:4)
为什么不用user_passes_test
装饰器包裹视图?你可以在那里运行你喜欢的任何支票 - 不需要黑客。
答案 1 :(得分:1)
您应该使用django-authority或any authority package。虽然,我不能保证他们不依赖黑客本身,但至少你不会孤军奋战。也就是说,这是解决您问题的有效方法:
Monkey patch django.template.base.RequestContext ,设置request.context = self。
创建模板上下文处理器,可以使用request.context
将上下文处理器添加到设置,您就可以了
以下是一个示例,您只需将其粘贴到settings.py中即可:
def print_context(request):
print request.context.get('form', 'No form in this context')
return {}
from django.template.base import RequestContext
orig_init = RequestContext.__init__
def new_init(self, request, **kwargs):
request.context = self
orig_init(self, request, **kwargs)
RequestContext.__init__ = new_init
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'settings.print_context',
)
请注意,你正在反对Django的设计,我发布这个答案假设你知道你在做什么 - 你非常了解Python和Django。