Django, как повторно использовать код представлений в других представлениях и шаблоне - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в django, и мне было интересно, можно ли повторно использовать код и аннотировать вывод, записанный в views.py.

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

Пример объявления У меня есть следующие представления. Как лучше всего повторно использовать этот код в других представлениях?

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)

1 Ответ

2 голосов
/ 05 мая 2020

Для файла 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

...