Передать данные в шаблон внешнего вида в Django? - PullRequest
0 голосов
/ 11 июня 2018

Я имею в виду, у меня есть классическая всегда присутствующая боковая панель, на которой я хотел бы отобразить некоторые данные модели (например, год / месяцы для даты публикации существующих постов, теги и т. П.).

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

Есть ли способ в django определить такую ​​логикуи связывать / вставлять его результат при каждом просмотре, который я сделал?

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

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Контекстный процессор, доступный в CONTEXT_PROCESSORS, будет доступен в каждом шаблоне, работающем с этим файлом настроек, для его создания:

  • создайте файл в своем проекте, назовите его context_processors.py рядом сsettings.py
  • Внутри создайте функцию, подобную представлению с параметром request, и она должна вернуть dict

    def function_name(request):
        variable = 'Hello World'
        # all stuff that you want to make available
        return {'variable':variable}
    
  • Перейти к settings.py, добавьте путь к вашему context_processors.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',
                <b>'project_name.context_processors.function_name',</b>
            ],
        },
    },
    ]
    
  • Теперь он доступен во всех шаблонах, работающих на sesttings.py файле

    <p>here is the {{ variable }}</p>
    
0 голосов
/ 11 июня 2018

У вас есть два варианта здесь.Вы можете либо создать микширование, которое вы можете включить в объявление класса, и расширить его get_context_data следующим образом:

class SidebarMixin():

   def get_context_data(self, **kwargs):
       context = super(SidebarMixin, self).get_context_data(**kwargs)
       context['sidebar'] = mycontext #insert here your stuff

class MyView(View, SidebarMixin):
   def get_context_data(self, **kwargs):
       context = super(MyView, self).get_context_data(**kwargs)
       context['mycontext'] = mycontext #insert here your stuff

В противном случае вы можете определить новый тег шаблона:

@register.inclusion_tag('sidebar.html', takes_context=True)
def sidebar(context):
    return {
        'sidebar': mysidebar_context,
    }
...