2017-02-11 14 views
1

У меня есть шаблон Django, назовем его index.html, который разделен на 3 части (заголовок, содержимое и нижний колонтитул). В разделе заголовка у меня есть панель поиска, которая включает раскрывающееся меню, которое позволяет пользователю выбирать из него опцию и искать вещи на основе выбранного варианта. Я хочу, чтобы раздел заголовка включался во все мои будущие виды/шаблоны и по-прежнему отображал раскрывающееся меню со всеми параметрами.Django как использовать функции просмотра, общие для всех представлений

Это то, что я в данный момент у меня в файле представления

def index(request): 
    return render(
        request, 
        'home.html', 
        {'categories': get_all_categories()} 
       ) 


def cart(request): 
    return render(request, 'cart.html', {'categories': get_all_categories()}) 


def help(request): 
    return render(request, 'help.html', {'categories': get_all_categories()}) 


def about(request): 
    return render(request, 'about.html', {'categories': get_all_categories()}) 


def contact(request): 
    return render(request, 'contact.html', {'categories': get_all_categories()}) 


def search(request): 
    return render(request, 'search.html', {'categories': get_all_categories()}) 


def get_all_categories(): 
    return Category.objects.all() 

Это то, что у меня есть cart.html {% распространяется "index.html" %}

{% block content %} 

<div> 
<h1> My Cart </h1> 
</div> 

{% endblock %} 

Это то, что contact.html имеет {% распространяется "index.html" %}

{% block content %} 

<div> 
<h1> Contact </h1> 
</div> 

{% endblock %} 

Т его является то, что home.html содержит {% проходит «index.html»%}

{% block content %} 

<div> 
<h1> Home </h1> 
</div> 

{% endblock %} 

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

ответ

1

Вы можете написать обычай context processor, чтобы включить эту переменную в каждый созданный вами шаблон.

Например, написать контекстный процессор вроде следующего (в context_processors.py, скажем):

def category_context_processor(request): 
    return { 
     'categories': get_all_categories(), 
    } 

И включить его в settings.py:

TEMPLATES = [ 
    ... 
    'OPTIONS': { 
     'context_processors': [ 
      ... 
      'myapp.context_processors.category_context_processor', 
     ], 
    }, 
} 

Теперь переменная categories доступна в каждом шаблоне вы производите (используя вызов render или RequestContext, в любом случае), независимо от контекста, который вы фактически передаете из представления.

0

Вы также можете использовать тег шаблона.

polls/ 
    __init__.py 
    models.py 
    templatetags/ 
     __init__.py 
     poll_extras.py 
    views.py 

В твой poll_extras.py файл

from django import template 

register = template.Library() 

@register.simple_tag 
def get_categories(request, arg1, arg2, ...): 
    return { 
     'categories': get_all_categories(), 
    } 

Или вы можете использовать inclusion_tag со своим шаблоном (оставаясь тем же во всех видах):

@register.inclusion_tag('categories_block_template.html') 
def get_categories(arg1, arg2, *args, **kwargs): 
    categories = Category.objects.filter(field1=arg1, ...) 
    ... 

И, наконец, шаблон необходимо скачать Templatetag и использовать его:

{% load poll_extras %} 

Вы можете увидеть больше о templatetags here

+0

А по-моему [Джанго Классный Метки] (https://django-classy-tags.readthedocs.io/en/latest/) является плюсом. –