访问上下文处理器

时间:2017-09-19 10:11:28

标签: django

在我的Django应用程序中,我有一系列通用视图(创建,更新,删除,详细信息,列表),我的大多数实际视图都是从这些视图继承而来的。所有这些视图都为上下文添加了许多有用的信息(模型的单数和复数名称,创建,列表等的URL)。但是这些视图或多或少全部重复相同的代码。出于这个原因,我想将这些东西移到上下文处理器并删除代码重复。

我的问题是,我似乎无法确定从传递给上下文处理器的请求中需要的东西(即:如果我可以访问模型实例,模型类,表单类等),那么我没事的。下面的代码显示了视图中get_context_data的样子 - 我将如何在上下文处理器中复制它?

感谢。

def get_context_data(self, **kwargs):
    """Passes context variables to the HTML templates."""
    context = super(CodexAnonDetailView, self).get_context_data(**kwargs)
    context['model_name'] = model_ngettext(self.model, 1)
    context['model_name_plural'] = model_ngettext(self.model, 2)
    context['object_create_url'] = reverse('%s:%s_create' % (resolve(self.request.path).app_name, self.model.__name__))
    context['model_list_url'] = reverse('%s:%s_list' % (resolve(self.request.path).app_name, self.model.__name__))

1 个答案:

答案 0 :(得分:0)

Django基于类的视图之美是你可以利用类继承来实现共享功能

定义一个实现所需行为的类,然后继承通用视图类和mixin

class MyMixin(object):

    def get_context_data(self, **kwargs):
        context = super(MyMixin, self).get_context_data(**kwargs)
        context['model_name'] = model_ngettext(self.model, 1)
        context['model_name_plural'] = model_ngettext(self.model, 2)
        context['object_create_url'] = reverse('%s:%s_create' % (resolve(self.request.path).app_name, self.model.__name__))
        context['model_list_url'] = reverse('%s:%s_list' % (resolve(self.request.path).app_name, self.model.__name__))
        return context


class MyCreateView(MyMixin, CreateView):

    model = MyModel