在Django中传递全局模板变量的正确方法是什么?

时间:2012-01-05 22:58:42

标签: django

假设这是我们想要的每个页面,我们创建“base_template.html”

    <title>{% block title %}{{ page_title }}{% endblock %}</title>

    <a href="http://{{domain}}{{current_path}}">{{ page_title }}</a>{% endblock %}

而不是从每个视图函数传递page_title,domain,current_path,而不是:

def display_meta(request):
    user_meta = request.META.items()
    sorted_meta = sorted(user_meta)     # a list of tuples
    return render_to_response('meta.html', {'sorted_meta': sorted_meta, 
                              'current_path': request.get_full_path(), 
                              'domain': request.get_host(),
                              'page_title': display_meta.__name__})
# and repeat the dictionary same manner for other views....

#urls.py
('^book_list/$', 'object_get_list', {'model': models.Book}),

另一种方法是包装视图功能

# urls.py
('^book_list/$', views.get_template(views.object_get_list),{'model': models.Book}),

# views.py
def get_template(view, **extrakw):

    def wrapview(request, **extrakw):
        template_dict = {'current_path': request.get_full_path(), 'domain': request.get_host()}
        extrakw['template_dict'] = template_dict
        return view(request, **extrakw)
    return wrapview


def object_get_list(request, **kwargs):
    model = kwargs.pop('model', None)
    model_name = model.__name__.lower()
    template_dict = kwargs.pop('template_dict', None)
    template_dict[model_name] = model.objects.all()
    template_dict['page_title'] = model_name +" list"
    template_name = '%s.html' %(model_name)
    return render_to_response(template_name, template_dict)

Pro:除了编辑htmls之外,现在修改只在一个视图中完成,而不是在每个视图中完成。

缺点:丑陋的URLConf,也可能是错误的支持

尝试3: 像我创建的template_dict一样创建一个全局字典。

template_dict = {/..../}

def view1()
def view2() ...

问题:我不能使用request.path(或任何与请求有关的事情)。这可以追溯到之前的尝试(包装器)。

但必须有一个更简单的方法。在整个django站点中传递全局模板变量的正确方法是什么,因此每个视图函数现在都不依赖于gloabl模板变量?

谢谢你的时间。

1 个答案:

答案 0 :(得分:6)

使用上下文处理器。

将您的功能名称添加到TEMPLATE_CONTEXT_PROCESSORS中的settings.py

我使用的简单上下文处理器是:

def common_request_parameters(request):
    return {'home_login_form': AuthenticationForm(request)}