2013-03-11 50 views
0

只是在这里寻找一些关于如何在“Django时尚”中实现这个概念的指导。Django查看预处理

我正在使用dbsettings来定义站点级变量。在每个请求中,我想检查一个站点级变量,并根据该变量的值呈现不同的响应。

现在我意识到我只需在每个视图函数中添加一个简单的if语句就可以轻松完成此任务,但我认为可能有一种方法可以将其应用于更高级别的应用程序中?

让我知道是否有办法在所有请求中“全局化”此功能。谢谢。

回答

1

实际上,如果设置将影响首先选择的模板或实质上影响响应,那么您真的可能需要的是middleware。这比使用模板上下文处理器更灵活,如果您只是想将几个变量添加到上下文中,则更合适。

您在创建自己的应用middleware.py,这可能包含这样的内容:

from django.conf import settings 

class MyMiddleware(object): 
    def process_request(self, request): 
     request.my_app_setting = settings.MY_APP_SETTING 

不要忘了你的类添加到您的MIDDLEWARE_CLASSES设置。

+0

对自定义视图装饰器有什么想法? – andersra 2013-03-12 03:27:06

+0

似乎不太干我。你可以带上一点盐,但是我个人会在没有完全必要时避免装饰者。我喜欢它们,它们是一个非常强大的工具,但它们也可以使代码变得更加神秘。我看到一个,我想,现在这个功能可能已经成为阳光下的任何东西。另一方面,中间件的目的更多地局限于你的确切类型的问题,缺点是有点“不可思议”。但是很明显,随机请求属性必须来自中间件。 – acjay 2013-03-12 06:56:49

+0

有了这个中间的解决方案,我没有看到你在哪里获得DRY优势。在视图中,我仍然必须检查request.my_app_setting,然后适当地重定向否?或者我可以检查此MyMiddleware对象中的request.my_app_setting的值,并相应地重定向? – andersra 2013-03-12 21:35:34

0

您可以使用自定义template context processors将“全局”上下文传递给您的视图。

要做到这一点,请在您的应用程序的某处创建一个新的contextprocessors.py,其代码类似于下面的示例(它只需要返回一个字典)。然后使用settings.py中的函数TEMPLATE_CONTEXT_PROCESSORS元组中的函数添加路径(即:yourapp.contextprocessors.resource_urls)。

from django.conf import settings 

def resource_urls(request): 
    """Passes global values to templates.""" 

    return dict(
     TIME_ZONE = settings.TIME_ZONE, 
    ) 

现在您可以按照预期在模板中引用这些键:{{ TIME_ZONE }}