Для файла views.py рекомендуется использовать декораторы. Дальнейшее объяснение здесь в другом вопросе.
Для шаблонов используйте тег {% include %}
. Например, вы можете написать фрагменты кода в другом документе (например, HTML) и просто вставить этот код в другой шаблон, используя тег шаблона {% include '_example.html' %}
. В этом случае другой файл называется _example.html
.
Edit 1:
Чтобы использовать тот же контекст в шаблонах других функций, нам нужно сделать следующее: создайте файл context_processor.py
в этом конкретном приложении Django. Это соглашение Django. Контекстные процессоры удобны, когда нам нужно сделать что-то глобально доступным для всех шаблонов во всех Django приложениях.
Контекстный процессор обычно возвращает словарь, который добавляется в request
контекст.
Концептуально ваш код будет выглядеть примерно так, вам может потребоваться отладить код на предмет ошибок -
# <app_name>/context_processor.py (this is the same folder where the views.py)
from .models import Materiale
def conto_economico(request):
# Creazione tabella materie prime, sussidiarie, di consumo e merci
defaults = list(0 for m in range(12))
elements = dict()
for conto_id, year, month, totale in(Materiale.objects.values_list('conto__nome', 'data__year', 'data__month').annotate(totale=ExpressionWrapper(Sum(F('quantita') * F('prezzo')),
output_field=FloatField())).values_list('conto__nome', 'data__year', 'data__month', 'totale').order_by("conto_id")) :
if conto_id not in elements.keys():
elements[conto_id]=list(defaults)
index=month-1
elements[conto_id][index]=totale
total_elements={'Per materie prime, sussidiarie, di consumo e di merci': [sum(t) for t in zip(*elements.values())],}
#context= {
#'elements': elements,
#'total_elements':total_elements,
#}
#return render(request, 'conto_economico/conto_economico.html', context)
return dict(elements=elements, total_elements=total_elements)
Соображения-
- Я никогда не использовал более одной переменной в
dict()
в context_processor.py
. В данном случае мы проходим двоих. Возможно, вам придется обратить внимание на любую ошибку.
А затем сделать этот контекст доступным в settings.py
файле проекта -
# 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',
'app_name.context_processors.conto_economico', # change the 'app_name' to the actual app name.
],
},
},
]
Теперь две переменные контекста elements
и total_elements
должны быть доступны для всех шаблонов. Больше не требуется копировать и вставлять код функции def conto_economico
в другие функции в views.py.
Дальнейшее чтение - https://dev.to/harveyhalwin/using-context-processor-in-django-to-create-dynamic-footer-45k4