是否可以检查是否已在自定义上下文处理器定义中的视图中设置了上下文变量?

时间:2011-05-13 19:15:09

标签: python django

问题在于,在某些视图中,我手动获取感兴趣的上下文变量(让我们说“G”),因为我用它来查找特定视图中的其他信息(即视图A,B,C),但是在其他视图(即X,Y,Z)中,我需要获取该特定的上下文变量,因为该上下文在我的项目中的每个视图中都可用(因为我的基本模板使用了上下文变量)。使用自定义上下文处理器的问题是我相信它会在视图(A,B,C)中进行额外的IDENTICAL DB调用,因为这些视图已经获得了该上下文变量,因为需要在视图中获取其他数据。我在想的可能是我可以实现一个上下文处理器来检查是否为给定的请求设置了特定的上下文变量。这可能吗?有更简单的解决方案吗?下面的代码可能会为某些人澄清问题。

感谢您的任何建议!

def viewA(request):
    g=G.objects.get(user=request.user)
    posts = Post.objects.filter(g=g)
    return direct_to_template(request,'something.html',{'G':g, 'posts':posts})

def viewX(request):
    stuff = Albums.objects.get(user=request.user)
    return direct_to_template(request,'something2.html',{'stuff':stuff})

def my_context_processor(request): #redundant in case of viewA (hits db again?)
    return {'G':G.objects.get(user=request.user)} 

def ideal_processor(request):
    #check context vars to see if G is already in there
    #if it is, return {}, else, return {'G':G.objects.get(user=request.user)} 

2 个答案:

答案 0 :(得分:0)

def always_G(request):
    if not hasattr(request, 'G'):
        {'G':G.objects.get(user=request.user)}

答案 1 :(得分:0)

我刚刚创建了将变量G设置为request.G的中间件,因为无论如何我几乎每个请求都需要它。即:

class GuildMiddleware(object):
    def process_request(self, request):
        request.G = figure_out_what_G_is()
        return None

现在,您可以在视图中的任何位置使用request.G(如果您使用的是direct_to_template,RequestContext等,则使用模板。)