наследование и контекст шаблона django - PullRequest
5 голосов
/ 16 сентября 2010

Я читаю полное руководство по django и нахожусь в Главе 4 по наследованию шаблонов.Кажется, я не делаю что-то настолько элегантное, насколько это возможно, поскольку мне приходится дублировать некоторый код, чтобы контекст появлялся при вызове дочернего представления.Вот код в 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())

Кажется излишним включать строку 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 %}

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

Ответы [ 3 ]

16 голосов
/ 17 сентября 2010

Вы можете передать переменную каждому шаблону, используя 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 голосов
/ 03 ноября 2010

Итак, вы можете использовать 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'},        
    }),
1 голос
/ 15 ноября 2017

Для django v1.8 + доступны переменные, возвращаемые внутри контекстный процессор .

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>

для обновления шаблонов до django 1.8+ следуйте за этим django doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...