Как передать переменные всем шаблонам в django?

Я пытаюсь передать переменные (переменные браузера) во все мои шаблоны в моем приложении. Любые советы о том, как заставить его работать?

Вид:

def browser(request):
    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))
    return render_to_response('reserve/templates/base.html', locals(), context_instance=RequestContext(request))

Шаблон:

{% for prod in browser %} {{ prod }}, {% endfor %}

person sharataka    schedule 19.08.2012    source источник
comment
Я не уверен, что это как-то связано с этим, но странно, что ваша функция называется browser, и вы также присваиваете значение переменной с именем browser. Я провел несколько экспериментов в оболочке Python, и это, похоже, не проблема, но вы можете изменить его, чтобы сделать его менее запутанным.   -  person Brian Neal    schedule 20.08.2012
comment
Также убедитесь, что ваш список не пуст. Попробуйте использовать отладчик или напечатайте значение в своем представлении.   -  person Brian Neal    schedule 20.08.2012
comment
И вы действительно спрашиваете, как заставить переменные отображаться во всех шаблонах или почему в этом конкретном случае переменная browser не работает?   -  person Brian Neal    schedule 20.08.2012
comment
@BrianNeal Сначала я хотел знать, почему переменная браузера не передается в base.html. Это позволит мне эффективно использовать переменную во всех шаблонах, что я и пытаюсь сделать.   -  person sharataka    schedule 21.08.2012


Ответы (3)


Вы, мой друг, ищете контекстные процессоры.

Из записи в блоге, написанной гораздо более ловким и эрудированным техническим писателем. Затем я:

Что такое обработчики контекста шаблона?

Контекстные процессоры Django — это средство, которое позволяет вам предоставлять данные и обратные вызовы для ваших шаблонов.

Вы можете сделать это одним из двух способов:

  • По индивидуальному запросу: путем передачи пользовательского Context значения в ваш render_to_response() вызов
  • Глобально: путем создания метода контекстного процессора, который принимает объект HttpRequest в качестве входных данных и возвращает полезную нагрузку или обратный вызов, затем регистрирует контекстный процессор в вашем settings.py, затем предоставляет вашему render_to_response() вызову встроенный атрибут RequestContext вместо вашего собственного (вы всегда можно расширить RequestContext, чтобы добавить больше данных по индивидуальному запросу, конечно).

Если такой подход к передаче данных в шаблоны показался вам абсурдным и запутанным, вы не одиноки. Сложность такой простой операции неоправданна и контрпродуктивна, но у каждой системы есть свои недостатки.

Официальная документация находится здесь:

https://docs.djangoproject.com/en/dev/ref/templates/api/

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

Вывод здесь для вас таков: контекстные процессоры — прекрасный тому пример. Да.

person fish2000    schedule 20.08.2012
comment
Разве не об этом просил ОП? ... Я склонен согласиться на личном уровне с излишеством, поскольку обычно я так не работаю. Но я не могу сказать наверняка в любом случае, поэтому лучше оставить это как приключение программистов, образовательный опыт которого далеко затмевает любые комментарии, которые я мог бы сделать. Во всяком случае, именно поэтому я добавил ¶ в конце, так как Q звучало как человек, который изучает фреймворк не меньше, чем решает конкретную техническую проблему. - person fish2000; 20.08.2012

В настоящее время вы передаете locals() в качестве области видимости переменной, которая также должна включать browser, но я нахожу использование locals() очень уродливым.

Лично я всегда предпочитаю такой шаблон:

def browser(request):
    context = RequestContext(request)

    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))

    context['browser'] = browser

    return render_to_response('reserve/templates/base.html', context_instance=context)
person Wolph    schedule 19.08.2012
comment
Кажется, это не работает... base.html по-прежнему ничего не отображает. - person sharataka; 20.08.2012
comment
@sharataka: в таком случае, возможно, список просто пуст? Что, если вы сделаете что-то вроде этого: browser = ['spam', 'eggs']? - person Wolph; 20.08.2012

Я могу привести пример моего кода, который отлично работает. Вот файл с именем context_processors.py:

context_processors.py

def base(request):
    user = request.user

#======================
#Login form
#=====================

# here is the code for login user or check if he is logged in already

return  {
        'user': user,
        }

и это часть моего base.html (шаблон, который я использую для всех своих страниц)

base.html

{% if user.username %}
                    <h3>
                        Welcome {{ user.username }}
                    </h3>
person Vor    schedule 20.08.2012