Как эффективно добавить похожие контексты в несколько представлений в 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>