2010-09-15 2 views
5

Я читаю окончательное руководство по django и в главе 4 о наследовании шаблона. Кажется, что я не делаю что-то столь же изящное, как это должно быть возможно, поскольку мне приходится дублировать некоторый код, чтобы контекст отображался при вызове дочернего представления. Вот код в views.py:django наследование шаблона и контекст

def homepage(request): 
    current_date = datetime.datetime.now() 
    current_section = 'Temporary Home Page' 
    return render_to_response("base.html", locals()) 
def contact(request): 
    current_date = datetime.datetime.now() 
    current_section = 'Contact page' 
    return render_to_response("contact.html", locals()) 

Кажется излишним включать строку current_date в каждую функцию.

Вот базовый HTML-файл, который главная вызовы:

<html lang= "en"> 
<head> 
    <title>{% block title %}Home Page{% endblock %}</title> 
</head> 
<body> 
    <h1>The Site</h1> 
    {% block content %} 
     <p> The Current section is {{ current_section }}.</p> 
    {% endblock %} 

    {% block footer %} 
    <p>The current time is {{ current_date }}</p> 
    {% endblock %} 
</body> 
</html> 

и дочерний шаблон файл:

{% extends "base.html" %} 

{% block title %}Contact{% endblock %} 

{% block content %} 
<p>Contact information goes here...</p> 
    <p>You are in the section {{ current_section }}</p> 
{% endblock %} 

Если я не включаю текущая_дат линии при вызове файла ребенок, где эта переменная должна быть пустой.

ответ

16

Вы можете передать переменную каждого шаблона с помощью Context Processor:

1. Добавление контекста процессора для настройки файла

Во-первых, вам нужно добавить пользовательский контекста процессора к вашему settings.py:

# settings.py 

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.context_processors.default', # add this line 
    'django.core.context_processors.auth', 
) 

Из этого можно вывести, что вам нужно будет создать модуль под названием context_processors.py и поместите его в ВОЛП вашего приложения производная Вы также можете увидеть, что ему нужно будет объявить функцию с именем default (поскольку это то, что мы включили в settings.py), но это произвольно. Вы можете выбрать любое имя функции, которое вы предпочитаете.

2. Создание контекста процессора

# context_processors.py 

from datetime import datetime 
from django.conf import settings # this is a good example of extra 
            # context you might need across templates 
def default(request): 
    # you can declare any variable that you would like and pass 
    # them as a dictionary to be added to each template's context: 
    return dict(
     example = "This is an example string.", 
     current_date = datetime.now(),     
     MEDIA_URL = settings.MEDIA_URL, # just for the sake of example 
    ) 

3. Добавление дополнительного контекста для ваших взглядов

Заключительным этапом является обработка дополнительного контекста с помощью RequestContext() и передать его в шаблон в качестве переменной , Ниже приведен очень упрощенный пример вида модификации файла views.py, которые потребовались бы:

# old views.py 
def homepage(request): 
    current_date = datetime.datetime.now() 
    current_section = 'Temporary Home Page' 
    return render_to_response("base.html", locals()) 

def contact(request): 
    current_date = datetime.datetime.now() 
    current_section = 'Contact page' 
    return render_to_response("contact.html", locals()) 


# new views.py 
from django.template import RequestContext 

def homepage(request): 
    current_section = 'Temporary Home Page' 
    return render_to_response("base.html", locals(), 
           context_instance=RequestContext(request)) 

def contact(request): 
    current_section = 'Contact page' 
    return render_to_response("contact.html", locals(), 
           context_instance=RequestContext(request)) 
3

Таким образом, вы можете использовать django.views, generic.simple.direct_to_template вместо render_to_response. Он использует RequestContext внутренне.

from django.views,generic.simple import direct_to_template 

def homepage(request): 
    return direct_to_template(request,"base.html",{ 
     'current_section':'Temporary Home Page' 
    }) 

def contact(request): 
    return direct_to_template(request,"contact.html",{ 
     'current_section':'Contact Page' 
    }) 

Или вы даже можете указать его непосредственно на urls.py, такие как

urlpatterns = patterns('django.views.generic.simple', 
    (r'^/home/$','direct_to_template',{ 
     'template':'base.html' 
     'extra_context':{'current_section':'Temporary Home Page'},   
    }), 
    (r'^/contact/$','direct_to_template',{ 
     'template':'contact.html' 
     'extra_context':{'current_section':'Contact page'},   
    }), 
0

Для Джанго v1.8 + переменные возвращенные внутри context processor может быть доступен.

1. Добавьте контекстную процессор вашего TEMPLATES список внутри settings.py

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     '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', 

       'your_app.context_processor_file.func_name', # add this line 

      ], 
     }, 
    }, 
] 

2.Создание нового файла для контекста процессора и определить метод для контекста

context_processor_file.py

def func_name(request): 
    test_var = "hi, this is a variable from context processor" 
    return { 
    "var_for_template" : test_var, 
    } 

3. Теперь вы можете получить var_for_template в любых шаблонах

, например, добавьте эту строку внутри: base.html

<h1>{{ var_for_template }}</h1> 

это сделает:

<h1>hi, this is a variable from context processor</h1>

для обновления шаблонов Джанго 1.8+ следовать this django doc

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