如何一次设置所有Django通用视图的上下文变量?

时间:2018-11-11 19:52:57

标签: python django django-class-based-views

我将为CRUD操作提供基于标准类的标准视图,这些视图继承自各种通用视图(如ListView,DetailView等)。 我将设置所有的 context_object_name 属性具有相同的值。

我想知道是否有一种方法可以使用更多的pythonic方法,而不是在代码中多次重复该操作,而是可以在必要时将变量更改为一个地方?

ps。我想到的当然是进一步的继承,但是也许还有一些类似django的方式?

2 个答案:

答案 0 :(得分:0)

Middleware can do the trick

class SetContextObjectNameMiddleware:

    def process_template_response(self, request, response):
        if 'object' in response.context_data:
            response.context_data['foo'] = response.context_data['object']
        return response

然后将中间件添加到您的settings.py

这并不是真正设置视图的context_object_name,但是可以达到相同的结果。

答案 1 :(得分:0)

您还可以使用mixin代替中间件应用程序:

class CommonContextMixin(object):
    def get_context_data(self, *args, **kwargs):
        context = super(CommonContextMixin, self).get_context_data(*args, **kwargs)
        context['foo'] = 'bar'

        return context

然后在您的视图中使用该混合:

class MyView(TemplateView, CommonContextMixin):
    """ This view now has the foo variable as part of its context. """

相关的Django文档:https://docs.djangoproject.com/en/2.1/topics/class-based-views/mixins/