2010-09-15 15 views
5

Ich lese die definitive Anleitung zu Django und bin in Kapitel 4 auf Vorlage Vererbung. Es scheint, dass ich nicht etwas so Elegantes mache, wie es möglich sein sollte, da ich etwas Code kopieren muss, damit der Kontext beim Aufruf der Kindansicht erscheint. Hier ist der Code in views.py:Django Vorlage Vererbung und Kontext

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

Es scheint redundant zu sein, die current_date Zeile in jeder Funktion enthalten. Hier

ist die Basis-HTML-Datei, die Anrufe Startseite:

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

und ein Kind Template-Datei:

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

Wenn ich beinhalten nicht die current_date Linie, wenn das Kind Aufruf der Datei, wo Diese Variable sollte leer sein.

Antwort

16

Sie eine Variable für jede Vorlage unter Verwendung eines Context Processor passieren kann:

1. Hinzufügen des Kontextprozessors, um Ihre Einstellungen Datei

Zuerst müssen Sie hinzufügen Ihren kundenspezifischen Kontext-Prozessor zu Ihrem settings.py:

# settings.py 

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

Von, dass Sie, dass Sie ein Modul context_processors.py genannt erstellen müssen ableiten können und legen Sie sie in fol Ihrer App die. Sie können weiterhin sehen, dass es eine Funktion namens default deklarieren muss (wie das ist, was wir in settings.py aufgenommen haben), aber das ist willkürlich. Sie können wählen, welchen Funktionsnamen Sie bevorzugen.

2. Erstellen der Context-Prozessor

# 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. den zusätzlichen Kontext zu Ihren Ansichten

Der letzte Schritt ist das Hinzufügen der zusätzlichen Kontext zu verarbeiten RequestContext() verwenden und es auf die Vorlage als eine Variable übergeben . Unten ist ein sehr einfaches Beispiel für die Art von Modifikation der views.py Datei, die erforderlich wäre:

# 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

So können Sie django.views verwenden, generic.simple.direct_to_template statt render_to_response. Es verwendet intern 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' 
    }) 

Oder man kann es auch direkt bei urls.py wie

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

Für django v1.8 + Variablen innerhalb context processor zugegriffen werden kann zurückzulegen.

1. Fügen Sie den Kontext-Prozessor auf Ihre TEMPLATES Liste innerhalb 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.Erstellen Sie neue Datei für Kontext-Prozessor und definieren Methode für kontext

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. Nun können Sie die var_for_template in allen Vorlagen erhalten

zum Beispiel, fügen Sie diese Zeile in: base.html

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

dies machen:

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

für Vorlagen der Aktualisierung auf django 1.8+ this django doc folgen