Django: Какая польза от параметра context_instance в функции ярлыка рендеринга? - PullRequest
14 голосов
/ 27 октября 2011

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

Согласно ссылке выше, параметр context_instance определен как

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

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

Ответы [ 3 ]

12 голосов
/ 27 октября 2011

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

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

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

9 голосов
/ 19 мая 2015

Экземпляр контекста в 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 голосов
/ 27 октября 2011

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

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

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

...