Универсальный метод Python / Django, переданный в движок шаблонов - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть большой проект Django, у которого уже есть сотни просмотров. Я создаю функцию tasks, где пользователи могут выполнять определенные задачи, связанные с конкретным приложением в проекте, который они используют. У меня есть несколько интерфейсов (так называемые приложения Django в проекте): admin, management, onsite и т. Д., И каждый интерфейс имеет собственную навигацию со ссылкой tasks.

Я хочу иметь возможность изменять цвет этой ссылки, если пользователь находится в интерфейсе, где task еще не завершено.

Это легко проверить в каждом представлении, и тогда я могу универсально отобразить правильный цвет для ссылки на основе переменной, переданной в представление, но это чрезвычайно утомительно для сотен представлений.

Полагаю, я мог бы добавить фильтр в каждый интерфейс / приложение Django, чтобы немного упростить это, но разве это самое простое решение?

Вот пример метода, который я хочу вызывать в навигации каждого интерфейса:

from objects_client.task_models.task_models import Tasks


def does_interface_have_open_tasks(current_interface, db_alias):
    if Tasks.objects.using(db_alias)\
            .filter(interface=current_interface, completed=0).exists():
        return True
    return False

1 Ответ

0 голосов
/ 24 апреля 2019

Я использовал Context Processor для решения своих задач, как показано ниже:

import traceback
from objects_client.task_models.task_models import Tasks


def universally_used_data(request):
    # I use multiple DBs
    db_alias = request.session.get('db_alias')

    # dictionary for global context values
    dictionary_to_return = dict()

    # interfaces and URL equivalents
    interface_dictionary = {
        'adm': 'admin',
        'mgt': 'management',
        'onsite': 'onsite',
        'secu': 'security',
        'maint': 'maintenance'
    }

    try:
        # get interface url
        short_url = request.path[1:-1].split('/')[1]
        # get interface from dictionary above
        interface = interface_dictionary.get(short_url)

        dictionary_to_return['SHORT_URL'] = short_url

        dictionary_to_return['INTERFACE'] = interface

        # see if there is an open task...
        if Tasks.objects.using(db_alias) \
                .filter(interface=interface, completed=0).exists():

            dictionary_to_return['OPEN_TASKS'] = True
        else:
            dictionary_to_return['OPEN_TASKS'] = False

    except Exception as ex:
        print(ex, traceback.format_exc())

    return dictionary_to_return


Вот как я загружаю Context Processor:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            ... 
        ]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
               ... 
                # custom processors
                'utils.context_processors.context_processors.universally_used_data'
            ],
        },
    },
]

Тогда яможно просто вызвать переменную this в шаблоне, чтобы изменить цвет элемента HTML, но не {% load [whatever] %} или что-либо еще:

{% if OPEN_TASKS %}
    style="color:red;"
{% endif %}

Спасибо @ Daniel Roseman за предложение / комментарий,Это меня немного озадачило :)

...