2010-09-15 5 views
5

Estoy leyendo la guía definitiva de django y estoy en el Capítulo 4 sobre herencia de plantillas. Parece que no estoy haciendo algo tan elegante como debería ser posible ya que tengo que duplicar algún código para que aparezca el contexto al llamar a la vista secundaria. Aquí está el código en views.py:herencia de plantilla django y contexto

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()) 

Parece redundante tener que incluir la línea current_date en cada función.

Aquí está el archivo html base que inicio Las llamadas:

<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> 

y un archivo de plantilla hija:

{% 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 %} 

Si no incluyo la línea fecha_actual cuando se llama al archivo secundario, donde esa variable debería aparecer está en blanco.

Respuesta

16

Puede pasar una variable a todas las plantillas mediante el uso de un Context Processor:

1. Agregar el procesador de contexto para presentar

En primer lugar la configuración, tendrá que añadir su procesador Contexto de encargo a su settings.py:

# settings.py 

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

Desde que se puede derivar que se necesita para crear un módulo llamado context_processors.py y colocarlo dentro de su aplicación fol der. Puede ver que necesitará declarar una función llamada default (como eso es lo que incluimos en settings.py), pero esto es arbitrario. Puede elegir el nombre de función que prefiera.

2. Crear el Contexto del procesador

# 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. Agregar el contexto extra a sus puntos de vista

El último paso es procesar el contexto adicional utilizando RequestContext() y pasarlo a la plantilla como una variable . A continuación se muestra un ejemplo muy simplista del tipo de modificación en el archivo views.py que se requeriría:

# 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

Por lo tanto, se puede utilizar django.views, generic.simple.direct_to_template en lugar de render_to_response. Utiliza RequestContext internaly.

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' 
    }) 

O incluso se puede especificar directamente en urls.py como

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

Para Django v1.8 + variables devueltas dentro context processor se puede acceder.

1. Añadir el procesador de contexto a su lista de TEMPLATES dentro 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.Crear nuevo archivo de procesador de contexto y método para definir el contexto

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. Ahora usted puede conseguir la var_for_template en cualquier plantilla

por ejemplo, añadir esta línea en el interior: base.html

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

esto hará que:

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

para las plantillas de actualizar a Django 1.8+ siga this django doc

Cuestiones relacionadas