Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2016 20:33:16

BearPro
Зарегистрирован: 2015-09-09
Сообщения: 46
Репутация: +  0  -
Профиль   Адрес электронной почты  

Одинаковый элемент во всех шаблонах

Идея такая: на каждой (почти) странице моего проекта есть один элемент (типа пользовательское меню).
Самый очевидный вариант - в каждый шаблон вставлять этот элемент, и каждый раз заново просчитывать контекст для этого меню. Мне это кажется не слишком оптимальным, и, в первую очередь - не удобным. Вдруг я захочу потом изменить что-то в этом меню, и мне придётся перелопатить +100500 шаблонов и представлений.
Есть ли возможность проще организовать такой момент?

Офлайн

#2 Окт. 7, 2016 21:23:10

Kudria
Зарегистрирован: 2016-10-02
Сообщения: 16
Репутация: +  1  -
Профиль   Отправить e-mail  

Одинаковый элемент во всех шаблонах

Самый очевидный вариант - templatetag

Офлайн

#3 Окт. 7, 2016 21:38:15

BearPro
Зарегистрирован: 2015-09-09
Сообщения: 46
Репутация: +  0  -
Профиль   Адрес электронной почты  

Одинаковый элемент во всех шаблонах

Kudria
Самый очевидный вариант - templatetag
Ой, а как этим пользоваться? Я на Djbook посмотрел - отхватил рак мозга. Объясните?

Офлайн

#4 Окт. 7, 2016 22:32:21

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Одинаковый элемент во всех шаблонах

самый очевидный вариант - это выделить этот элемент в отдельный шаблон который включать в целевой шаблон



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 10, 2016 11:45:27

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Одинаковый элемент во всех шаблонах

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

Отредактировано Elaphe (Окт. 10, 2016 12:28:36)

Офлайн

#6 Окт. 11, 2016 23:21:44

Ateros
Зарегистрирован: 2016-10-11
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Одинаковый элемент во всех шаблонах

Для вывода на всех страницах можно добавить свой 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


Офлайн

#7 Окт. 16, 2016 11:27:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Одинаковый элемент во всех шаблонах

BearPro
Есть ли возможность проще организовать такой момент?
Python - объектно ориентированный язык программирования. Очевидно, что раскрыть всю мощь языка можно только используя его ключевые особенности. Поэтому советую сразу на начальном этапе забыть про представления-функции и освоить представления-классы. Имея базовый класс и наследуя его вы получите то что хотите - одинаковое поведение разных представлений без копирования кода и без всякой мутной ерунды типа контекст-процессоров.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version