2010-09-15 95 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 %} 

如果调用子文件的时候,在这里我不包括CURRENT_DATE线该变量应该显示为空白。

回答

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模块,并将其放在您的应用程序的内部FOL DER。您可以进一步看到它需要声明一个名为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

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

更新模板Django的1.8+遵循this django doc