代码之家  ›  专栏  ›  技术社区  ›  Daniel Quinn

如何在Django的每一页上都显示一些内容?

  •  3
  • Daniel Quinn  · 技术社区  · 16 年前

    我很好奇,如果不需要手动将数据分配到每一页上,如何处理在每一页或多页上出现某些内容的最佳实践方法,如下所示:

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

    locality 每一页的作业。。。我只是不确定最好的方法。我很确定这不是最后一个。

    4 回复  |  直到 16 年前
        1
  •  16
  •   Ned Batchelder    16 年前

    你想要一杯吗 context processor . 它们生成的数据包含在作为 RequestContext

        2
  •  3
  •   bigjust    16 年前

    有一个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

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

        3
  •  2
  •   Mark Lavin    16 年前

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

        4
  •  0
  •   Alex Martelli    16 年前

    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