Как эффективно добавить похожие контексты в несколько представлений в django?

Предположим, у нас есть два или более представления, где шаблоны каждого представления расширяются из base.html, а внутри base.html находятся контекстные переменные project_name и company_name:

base.html:

<!DOCTYPE html>
<html>
  <head>
    <title>{{ project_name }}</title>
  </head>
  <body>
    {{ company_name }}
    {% block content %}{% endblock %}
  </body>
</html>

Тогда мы должны добавить вышеупомянутые контексты к нашим представлениям следующим образом:

views.py

def view1(request)
    context = {
        "view1 data": "some data",
        "project_name": "Project Name",
        "company_name": "Company Name",
    }
    return render(request, "view1.html", context)


class View2(DetailView):
    template_name = "view2.html"
    model = SampleModel

    def get_context_data(self, **kwargs):
        context = super(View2, self).get_context_data(**kwargs)
        context["view2 data"] = "sample data"
        context["project_name"] = "Project Name"
        context["company_name"] = "Company Name"
        return context

Как написать эффективный код, чтобы наши представления выглядели следующим образом, т.е. общие контексты project_name и company_name были разложены где-то еще, но все равно отображались в base.html?

desired views.py

def view1(request)
    context = {
        "view1 data": "some data",
    }
    return render(request, "view1.html", context)


class View2(DetailView):
    template_name = "view2.html"
    model = SampleModel

    def get_context_data(self, **kwargs):
        context = super(View2, self).get_context_data(**kwargs)
        context["view2 data"] = "sample data"
        return context

Насколько я знаю, есть подходы, позволяющие достичь этого более эффективно. но добавление контекстного процессора является для меня наиболее эффективным.

Итак, следующий фрагмент кода может помочь понять процесс:

создайте новый файл python в любой папке вашего приложения; желательно назвать его 'context_processors.py' в этом файле 'context_processors.py' вы можете написать::

def any_function_name(request):
    any_dictionary_name = {
         "view1 data": "some data",
        "project_name": "Project Name",
        "company_name": "Company Name",

                       }
    return any_dictionary_name

[Примечание: Например, вы можете даже написать queryset для получения любых данных и сделать их доступными golbally]

Затем перейдите в основной проект settings.py:

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'your_app_name.context_processors.any_function_name' #Add the file reference here
            ],
        },
    },
]

После этого вы можете получить доступ к вашим контекстным данным в любом месте шаблона следующим образом:

 <head>
    <title>{{ project_name }}</title>
  </head>
  <body>
    {{ company_name }}
    {% block content %}{% endblock %}
  </body>
</html>
Вернуться на верх