2014-04-04 2 views
1

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

<!DOCTYPE html> 
<html lang="en"> 
<head> 
     <link rel="stylesheet" href="style.css" /> 
    <title>{% block title %}My amazing site{% endblock %}</title> 
{% load staticfiles %} 
<link rel="stylesheet" type="text/css" media="screen" href="{% static "css/main.css" %}"/>    
    <link rel="stylesheet" type="text/css" media="screen" href="{% static "bootstrap/css/bootstrap.min-rtl.css" %}" > 
    <link rel="stylesheet" type="text/css" media="screen" href="{% static "bootstrap/css/bootstrap-responsive.min-rtl.css" %}" > 
    </head> 

<body class="container-fluid" > 
<div class="row-fluid" > 
<div id="sidebar" class="span12"> 
    {% block sidebar %} 

    {% endblock %} 
</div> 
</div> 
<div class="row-fluid"> 
    <div class="span8 offset2"> 
     {% block slider %} 

     {% endblock %} 
    </div>  
</div> 
    </body> 
    </html> 

как я должен создать некоторые переменные, которые могут быть доступны через всего приложения, и мне не нужно брать их из db для каждой отдельной страницы отдельно?

заранее спасибо за любую помощь

ответ

2

Вы можете написать контекстный шаблон процессор или тег шаблона.

контекст шаблона процессор

settings.py

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos", 
) 

MyApp/processor.py

from myproject.myapp.models import Foo 

def foos(request): 
    return {'foos': Foo.objects.all()} 

, а затем вы можете использовать {{FOOS}} в любом шаблоне

, обеспечивающий передачу context_in Позиция в вашем render_to_response

return render_to_response('index.html', {}, context_instance=RequestContext(request)) 

Шаблон теги

+0

Спасибо за ответ, но когда дело доходит до просмотра, мой код выглядит так: t = loader.get_template ('home.html'); c = Контекст ({ 'first': first_list, 'second': second_list }); return HttpResponse (t.render (c)); Как мне изменить его, чтобы заставить его работать с переменными процессора? – Siavosh

2

Вы хотите использовать template context processors. Я не мог найти очень четкое описание в документации Django, но шаблонные контекстные процессоры в основном являются вызывающими, вызываемыми с запросом, и возвращают словарь контекстных переменных для всех доступных шаблонов (не строго все шаблоны, но если вы используете django.shortcuts.render, вы охвачены).

Определение ваших активных контекстных шаблон процессоров немного неудобно, потому что вы не можете просто добавить процессор в список процессоров по умолчанию, и вы обычно хотите сохранить те по умолчанию, так что вам нужно сбросить цельные список процессоров по умолчанию плюс процессора в настройках файла:

В настройках:

TEMPLATE_CONTEXT_PROCESSORS = (

    # the default processors: 
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.core.context_processors.static", 
    "django.core.context_processors.tz", 
    "django.contrib.messages.context_processors.messages", 

    # your processor that will populate the context with a list of categories: 
    "myapp.context_processors.categories", 

) 

В вашем myapp/context_processors.py:

def categories(request): 
    return { 
     'categories': Category.objects.all() 
    } 

При необходимости измените имена файлов и категории.

+1

Спасибо за ответ, но когда дело доходит до просмотра, мой код выглядит так: t = loader.get_template ('home.HTML '); c = Контекст ({'first': first_list, 'second': second_list}); return HttpResponse (t.render (c)); Как передать глобальную переменную шаблону при визуализации представлений. – Siavosh

+0

Вам нужно будет использовать 'RequestContext (request, {...})' вместо простого 'Context'. Регулярные 'Context' не используют шаблонные контекстные процессоры, а' RequestContext'' делают. – lanzz

Смежные вопросы