Подтвердить что ты не робот

Django: Какое использование параметра context_instance в функции сокращения ярлыка?

Документация по ярлыку "Render"

В соответствии со ссылкой выше параметр context_instance определяется как

Экземпляр контекста для визуализации шаблона. По умолчанию шаблон будет отображаться с экземпляром RequestContext (заполненным значениями из запроса и словаря).

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

4b9b3361

Ответ 1

Основной сценарий - сделать определенные переменные доступными в вашем шаблоне. Например, обработчик контекста auth делает (среди прочих) переменную user доступной для использования в вашем шаблоне, так что вам не нужно передавать ее самостоятельно. Хотя это довольно большой абзац, документация Django неплохо объясняет это.

Вкратце: добавив context_instance=RequestContext(request) к вашему вызову render, все процессоры, определенные в вашем settings.py (под переменной TEMPLATE_CONTEXT_PROCESSORS), выполняются в порядке. Каждый из этих процессоров возвращает dict с переменными, которые становятся доступными в шаблоне. Используя набор по умолчанию, это означает, что вам не нужно добавлять, например. переменные user, csrf или messages: это выполняется процессорами.

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

Ответ 2

Экземпляр контекста теперь устарел в Django 1.8, а словарь переименован в контекст.

Изменено в Django 1.8:
Аргумент контекста назывался словарем. Это имя устарело в Django 1.8 и будет удалено в Django 2.0.

Устаревший с версии 1.8:
Аргумент context_instance устарел. Просто используйте контекст.

Итак, если вы используете более новую версию Django, ваш вызов функции Render должен быть:

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {"foo": "bar"},
        content_type="application/xhtml+xml")

Где {"foo": "bar"} - ваш контекст. Отсутствует context_instance (предположим), созданный по умолчанию и заполненный требуемым контекстом вашего запроса.

Ответ 3

Я могу думать о двух вещах:

  • Обратная совместимость. Вы можете безопасно изменить все ссылки от render_to_response до render.

  • Вы не хотите, чтобы контекстные процессоры запускались для этого конкретного представления, вы можете передать None в context_instance (сэкономить немного служебных данных.)