自定义通用视图

上述示例仅在你的任务完全是标准任务时才有效。例如,你不会在此处添加额外的上下文。

让我们做一个更现实的例子。假设我们要向模板添加页面标题。在功能视图中,这可以像这样工作 - 只需一行:

def create_object(request):
    page_title = 'My Page Title'

    # ...

    return render_to_response('template.html', locals())

使用通用视图实现这一点会更困难(或者是反向插值)。由于它们是基于类的,因此你需要覆盖一个或多个类的方法以实现所需的结果。在我们的示例中,我们需要覆盖类的 get_context_data 方法,如下所示:

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

在这里,我们需要四行代码而不是一行 - 至少对于我们想要添加的第一个附加上下文变量。