Повторное использование контекста в нескольких представлениях

Я очень новичок в Django и в моем приложении у меня есть динамическая панель навигации сверху. Контекст передается как контекст. Представьте, что это выглядит следующим образом:

<ul>
    {% for link in links %}
    <li><a href="{{ link }}"></a></li>
    {% endif %}
</ul>

Представления могут выглядеть следующим образом:

def nav_links():
    # Display links to first 5 MyModel objects
    objects = MyModel.objects.all()[:5]
    return [o.get_absolute_url() for o in objects]

def index(request):
    return render("request", "app/index.html", context={"links": nav_links()})

def page1(request)
    some_data = ...
    return render("request", "app/page1.html", context={"links": nav_links(), "data": some_data})

def page2(request)
    return render("request", "app/page2.html", context={"links": nav_links()})

...

В настоящее время мне нужно передавать links в качестве контекста в каждом представлении. Это, очевидно, плохой дизайн.

Есть ли способ передать один и тот же контекст для всех представлений?

Вы можете работать с контекстным процессором, это функция, которая каждый раз запускается для заполнения контекста. Такой контекстный процессор выглядит как ваш nav_links, за исключением того, что это должен быть словарь с именем(ями) переменной(ых) и соответствующим значением(ями):

# app_name/context_processors.py

def links(request):
    from app_name.models import MyModel
    objects = MyModel.objects.all()[:5]
    return {'links': [o.get_absolute_url() for o in objects]}

Затем вы можете зарегистрировать контекстный процессор в settings.py с помощью:

# settings.py

# …

TEMPLATES = [
    {
        # …,
        'OPTIONS': {
            'context_processors': [
                # …,
                'app_name.context_processors.links'
            ],
        },
    },
]
Вернуться на верх