Python Django CBV-如何避免为每个视图重复get_context_数据以获取自定义标题?

Python Django CBV-如何避免为每个视图重复get_context_数据以获取自定义标题?,python,django,django-class-based-views,Python,Django,Django Class Based Views,我正在为我的项目的每一页设置一个{{title}。有时此标题是一个静态字符串,例如输入您的姓名,有时它基于该页面上的相关对象,例如员工。名字 为了创建context['title'],我在每个基于类的视图中使用get\u context\u data。但这似乎导致我每次都重复一段代码,我希望以某种方式减少这种情况 例如,要为每个页面编写自定义标题,我必须编写以下内容: def get_context_data(self, **kwargs): context = super(SomeVi

我正在为我的项目的每一页设置一个
{{title}
。有时此
标题
是一个静态字符串,例如
输入您的姓名
,有时它基于该页面上的相关对象,例如
员工。名字

为了创建
context['title']
,我在每个基于类的视图中使用
get\u context\u data
。但这似乎导致我每次都重复一段代码,我希望以某种方式减少这种情况

例如,要为每个页面编写自定义标题,我必须编写以下内容:

def get_context_data(self, **kwargs):
    context = super(SomeView, self).get_context_data(**kwargs)
    context['title'] = 'Title for This page'
    return context
我觉得最好是有一个mixin,我只是以某种方式传入
title
的变量,我的
context
字典将根据传入的变量自动添加
context['title']


这可能吗?有没有一种方法可以创建一个mixin,这样我所要做的就是传入一个变量,它会为标题提供一个上下文,而不是为每个视图编写一段代码

我通常通过混合解决这个问题:

class TitleMixin(object):
    """Pass a defined title to context"""

    title = None

    def get_title(self):
        return self.title

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = self.get_title()

        return context
在视图中,可以执行以下操作:

class BlogIndex(TitleMixin, ListView):
    title = 'Blog entries'

class EntryDetail(TitleMixin, DetailView)
    def get_title(self): # for dynamic title, such as coming from a model field
        return self.object.title

是的,这是可能且简单的:

class YourTitleMixin(object):
    title = None # or your default title if you won't provide any

    def get_title(self):
        return self.title

    def get_context_data(self, **kwargs):
        context= super(YourTitleMixin, self).get_context_data(**kwargs)
        context['title'] = self.get_title()
        return context
你使用它:

def YourPageView(YourTitleMixin, DetailView):
    title = "Your Page Title" # you can either use this ...

    def get_title(self):
        return self.get_object().name # ... or that, if your title should be generated from some data
但这有必要吗?您是否在模板中只使用一次标题?视图之间是否共享一个模板?也许你可以在你的模板中完成?例如:

{# base.html #}
<html>
  <head>
    <title>{% block page_title %}My page{% endblock %}</title>
  </head>
</html>

这行不通。您可能是指
context['title']=self.get\u title()
?这是否假设每个模型在其模型定义中都定义了
get\u title
方法?如果我想要标题“作者的所有博客条目:
author.first_name
”?这种类型的标题是静态数据和对象数据的混合。您可以在get_title中返回:
return“来自作者的所有博客条目:%s”%(self.author.first_name),
是,通过覆盖
get_title
方法,您可以将静态数据和来自
self.object
的数据结合起来,
self.queryset
或视图上的任何其他属性。这也是我的想法,但我喜欢在视图中设置标题,因为我经常与多个视图共享一个模板。小心使用
get_对象
,它将向视图添加一个查询,因为它已在
super()中调用。get_context_data()
)您还可以在基于mixin的解决方案中使用super从父类获取标题,并将两个标题粘合在一起,就像在基于模板的解决方案的示例中一样。您还可以混合使用这两种解决方案,以获得更大的灵活性。这完全取决于你。
{# detail.html #}
{% extends "base.html" %}
{% block title %}{{ article.name }} - {{ block.super }}{% endblock %}
{# will result in "article name - My Page". You don't need to use super if you don't want to #}