2010-05-09 92 views
0

假设我正在编写一个Django应用程序,并且应用程序中的所有模板都需要某个变量。如何从Django应用程序添加上下文处理器

处理这个afaik的“经典”方法是编写一个上下文处理器并将其添加到settings.py中的TEMPLATE_CONTEXT_PROCESSORS。

我的问题是,考虑到应用程序应该与使用它们的实际项目“独立”,这是否正确吗?

换句话说,将该应用程序部署到新项目时,是否有任何方法可以避免项目必须明确地调整其设置?

回答

1

你的假设,即应用程序可以只是在一个项目中添加不接触该项目的设置是不正确的。

如果您将某个应用程序添加到项目中,则必须编辑设置,因为您必须将其添加到INSTALLED_APPS元组中。

那么为什么不编辑上下文处理器列表?

+0

是的。如果您的担心是您不想将额外的负担传递给应用程序,那么我说不用担心。我已经习惯了根据应用程序需要修改我的INSTALLED_APPS和CONTEXT_PROCESSORS设置的想法。 – Koobz 2010-05-09 14:52:25

+0

这些是唯一需要编辑的两件事吗?因为前一阵子,我意识到你必须确保你的static_media文件夹包含应用程序的静态媒体。换句话说,我们在谈论移动应用程序时必须记住的三个不同“行为”。我想我只是试图从应用中获得“更多”,而不是他们的意图。 – 2010-05-09 15:15:55

+0

中间件是应用程序的另一个常见附加设置。在从模块化应用程序中获得的功能性收益方面,编辑网站中的少数几行代码和设置的宏伟计划是微不足道的。 – digitaldreamer 2010-05-09 15:36:41

0

是的,添加上下文处理器是实现这一目标的最佳方法。

1

上下文处理器是非常有用的,我不会在使用它们时太害羞,但在某些情况下它是没有意义的。

这是我使用的技术,当我需要在应用中包含所有视图的简单内容时使用。我无法证明这是做事的“正确”方式,但它适用于我们的团队:

我会在文件的顶部声明一个全局字典template_vars。每个视图都会将其自己的变量添加到此字典中,并将其传递到模板,并返回template_vars中的render_to_response快捷方式。

它看起来是这样的:

template_vars = { 
    'spam': 'eggs', 
    } 

def gallery(request): 
    """ 
    portfolio gallery 
    """ 

    template_vars['projects'] = Projects.objects.all() 
    return render_to_response('portfolio/gallery.html', template_vars, context_instance=RequestContext(request)) 
相关问题