我有一个有菜单的网站。要生成菜单,我需要在数据库中进行一些查询。所以我创建了一个上下文处理器来处理我所有的视图。在
我有的观点实际上是形式。我使用ajax获取它们,并在用户单击一些按钮时用jqueryui对话框显示它们。在
我不能删除那些相当复杂的表单的所有上下文处理器,我需要auth、static和il8n上下文处理器。 但是我不想在数据库中使用基于菜单的查询来显示这些表单。在
有没有办法在视图中排除上下文处理器? 我试着加入一个变量“会话请求“在视图中,然后删除它并在上下文处理器中返回一个空字典。但这很糟糕,而且可能存在并发问题。 我也可以在上下文处理器中解析“request”中的url并返回一个空字典,但这听起来又像是一次黑客攻击。在
有什么想法或建议吗? 谢谢
重新设计你的应用程序可能更容易一些,这样一些视图就可以进行此查询,而其他视图则不会。您可以通过编写一个“基于类的视图”来避免这导致大量的重复,方法是:编写一个“基于类的视图”来生成这个特定的数据库查询并将其添加到上下文中,然后在需要新视图进行额外查询时继承它。我主张使用这种方法,而不是全局上下文处理器。在
This example演示如何向默认模板上下文添加内容。在
您可以在
django.template.context
中子类RequestContext
,并重新定义其__init__
方法。然后您可以在这些特定的视图中使用这个修改过的RequestContext
。RequestContext
的__init__
当前如下所示:在这里,
get_standard_processors()
返回在您的设置中定义的上下文处理器。在调用上下文处理器(上面代码的最后一行)之前,您可以添加一个检查来确定哪些处理器需要使用,哪些处理器需要跳过。在Django的对象是lazy对象。您不需要计算上下文处理器中的实际内容,而是提供一个具有关联函数的lazy对象;当某个对象实际尝试使用该对象时,例如在模板中,它就会调用该函数。This answer给出了同一问题的一个例子。在
如果多次使用该变量,请注意记住;有些选项将重新调用函数,而有些选项将保存结果。您可以查看the source来确定。我认为
SimpleLazyObject
(如上面的答案中所示)能满足您的需要,但我最近还没有充分使用它来确定。在(按要求答复……)
相关问题 更多 >
编程相关推荐