如何在Django的每个页面上显示某些内容?

时间:2010-01-04 01:38:01

标签: python django

我很好奇处理在每个页面或多个页面上显示某些内容的最佳实践方法,而无需手动将数据分配到每个页面,如下所示:

# views.py

def page0(request):
    return render_to_response(
        "core/index.html",
        {
            "locality": getCityForm(request.user),
        },
        context_instance=RequestContext(request)
    )

def page1(request):
    return render_to_response(
        "core/index.html",
        {
            "locality": getCityForm(request.user),
        },
        context_instance=RequestContext(request)
    )
...
def page9(request):
    return render_to_response(
        "core/index.html",
        {
            "locality": getCityForm(request.user),
        },
        context_instance=RequestContext(request)
    )

现在我可以考虑一些方法来做到这一点,包括编写我自己的Context或者一些中间件,当然,在每个页面上复制/粘贴这个locality任务......我只是没有确保最好的方法来做到这一点。我很确定它不是最后一个。

4 个答案:

答案 0 :(得分:16)

你想要一个context processor。它们生成的数据包含在以RequestContext创建的每个上下文中。它们是完美的。

结合显示常见内容的基本模板,您可以摆脱对复制和粘贴代码的大量需求。

答案 1 :(得分:3)

在模板引擎中使用继承:

有一个包含公共代码的base.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
<div id="sidebar">
    {% block sidebar %}
    <ul>
        <li><a href="/">Home</a></li>
        <li><a href="/blog/">Blog</a></li>
    </ul>
    {% endblock %}
</div>

<div id="content">
    {% block content %}{% endblock %}
</div>
</body>
</html>

然后在每个需要该公共代码的页面中,只需:

{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

http://docs.djangoproject.com/en/dev/topics/templates/#id1

这与上下文处理相结合将消除大量重复代码。

答案 2 :(得分:2)

中间件是一种选择,或者您可以编写自定义template tag

答案 3 :(得分:0)

要完全按照您的要求进行操作,我只需定义一个函数:

def foobar(req):
    return render_to_response(
        "core/index.html",
        {
            "locality": getCityForm(req.user),
        },
        context_instance=RequestContext(req)
    )

将其放在某个模块myfun中,并在需要的地方放置return myfun.foobar(request)。您可能需要更多参数,但只要它保持简单,使用OOP定义中间件就更简单了。&/ c。