在自定义上下文处理器定义中,可以检查视图中上下文变量是否已设置吗?
问题是,在某些页面中,我需要手动获取一个我关心的上下文变量(我们称它为“G”),因为我用它来查找该页面的其他信息(比如页面A、B、C)。但是在其他页面(比如X、Y、Z)中,我也需要获取这个特定的上下文变量,因为这个变量在我项目的每个页面中都需要用到(因为我的基础模板使用了这个上下文变量)。使用自定义的上下文处理器会有个问题,我觉得这样会在页面A、B、C中多进行一次相同的数据库查询,因为这些页面已经在获取这个上下文变量,因为它是获取其他数据所必需的。我在想,也许我可以实现一个上下文处理器,检查在特定请求中这个上下文变量是否已经设置。这样做可行吗?有没有更简单的解决方案?下面的代码可能能帮助一些人更好地理解这个问题。
谢谢大家的建议!
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
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶一样。
有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据不完整。这就像是你在倒水的时候,发现水桶有个洞,水流出去了一部分,导致你最后得到的水比预期的少。
为了避免这些问题,我们可以使用一些工具和方法来确保数据的完整性和正确性。就像在倒水之前,先检查水桶有没有洞,确保水能顺利倒进去。
总之,处理数据就像是一个小实验,我们需要仔细观察,确保每一步都做对了,这样才能得到我们想要的结果。
def always_G(request):
if not hasattr(request, 'G'):
{'G':G.objects.get(user=request.user)}
0
我刚刚写了一个中间件,它会把变量 G 设置为请求中的 G,因为我几乎在每次请求中都需要这个变量。也就是说:
class GuildMiddleware(object):
def process_request(self, request):
request.G = figure_out_what_G_is()
return None
现在你可以在你的视图(如果你使用 direct_to_template、RequestContext 等)中的任何地方使用 request.G 了。