Найти - Пользователи
Полная версия: Одинаковый элемент во всех шаблонах
Начало » Django » Одинаковый элемент во всех шаблонах
1
BearPro
Идея такая: на каждой (почти) странице моего проекта есть один элемент (типа пользовательское меню).
Самый очевидный вариант - в каждый шаблон вставлять этот элемент, и каждый раз заново просчитывать контекст для этого меню. Мне это кажется не слишком оптимальным, и, в первую очередь - не удобным. Вдруг я захочу потом изменить что-то в этом меню, и мне придётся перелопатить +100500 шаблонов и представлений.
Есть ли возможность проще организовать такой момент?
Kudria
Самый очевидный вариант - templatetag
BearPro
Kudria
Самый очевидный вариант - templatetag
Ой, а как этим пользоваться? Я на Djbook посмотрел - отхватил рак мозга. Объясните?
JOHN_16
самый очевидный вариант - это выделить этот элемент в отдельный шаблон который включать в целевой шаблон
Elaphe
1) написать функцию, которая собирает и возвращает нужные переменные контекста (в виде словаря)
2) использовать RequestContext, которому передавать данные из вашей функции, в коде это будет выглядеть так:
 from django.template import RequestContext
from my_module import get_context # сюда подставить имя и путь для вашей функции
...
def my_view(request):
    form = ...
    tittle = 'Заголовок моей супер-страницы'
    ....
        return render_to_response('your_template.html', {
                'form':form,
                'title':title,
            },
            context_instance=RequestContext(request, processors=[get_context]))
3) Ну и в темплейты включать инклуд, который обрабатывает переменные из функции get_context
Ateros
Для вывода на всех страницах можно добавить свой context_processors в settings.py

 TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'extra_context.vars', # мой контекст процессор
            ],
        },
    },
]


и сам файл extra_context.py в корне проекта:

 #-*- encoding: utf-8 -*-
def vars(request):
    return {
        "var_anywhere":"anywhere_value",
    }

В итоге в каждом шаблоне, который рендерится через render появляется переменная var_anywhere


FishHook
BearPro
Есть ли возможность проще организовать такой момент?
Python - объектно ориентированный язык программирования. Очевидно, что раскрыть всю мощь языка можно только используя его ключевые особенности. Поэтому советую сразу на начальном этапе забыть про представления-функции и освоить представления-классы. Имея базовый класс и наследуя его вы получите то что хотите - одинаковое поведение разных представлений без копирования кода и без всякой мутной ерунды типа контекст-процессоров.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB