django中的常见组件

时间:2009-07-19 04:11:38

标签: django django-templates

我知道我可以在django中使用这样的常见内容

<html>

{% include "header.html" %}

<div id = 'content'>
blah
</div>

{% include "footer.html" %}
</html>

但似乎我需要传递数据footer.html和header.html 我包括这些页面的时间?

谢谢

4 个答案:

答案 0 :(得分:3)

Django的template inheritance可能正是你想要的,不重复包含和其他样板。如果通过“传递数据”,则表示在渲染上下文中,例如有一些数据总是要放在那里,最简单的方法是使用填充数据公共部分的工厂函数制作所有渲染上下文。

编辑:对于工厂功能,我想到的没有什么特别的花哨,只是例如一个简单的课程:

class ContextFactory(object):
  def __init__(self, **pervasive):
    self.pervasive = pervasive
  def makeContext(self, current):
    return dict(self.pervasive, **current)
  def registerPervasive(self, name, value):
    self.pervasive[name] = value

(等等,如果您需要更多功能)然后在您的某个适当模块中实例化单个实例contextFactory。您的视图当前可能使用{'foo': bar}等上下文字符进行渲染,您将使用contextFactory.makeContext({'foo': bar})为上下文工厂提供一个机会来注入当前向其注册的任何名称/值对 - 这些都是,真的。

答案 1 :(得分:0)

这也让我感兴趣的是作为Django的新手,具有ASP.NET背景。我有兴趣制作可以包含在某些视图中的“独立”组件,但如果在视图中不需要它们,我不想在每个视图方法中为它们添加数据。如果我需要构建一个知道所有可能包含所需数据的上下文对象,那么事情会变得更加耦合。

我注意到其他地方可能会使用自定义标记来设置包含模板的数据。即使它需要更多的编程,它似乎是一个更清洁的解决方案。可以在http://docs.djangoproject.com/en/dev/ref/contrib/comments/#ref-contrib-comments-index

找到使用示例

答案 2 :(得分:0)

请参阅Why on earth do I have to pass RequestContext in all of my responses?

显然这是一种常见的痛苦,有一个叫做django-annoying的包来解决这个问题(等等)。

答案 3 :(得分:0)

如果您编写自己的标记https://docs.djangoproject.com/en/1.4/howto/custom-template-tags/

,则每次都不需要传递数据
  1. 编写自定义模板标记
  2. 您的标记实现能够从HTTP请求标头等中检索数据库中的数据。
  3. 在base.html模板中使用您的代码
  4. 示例:假设您希望每个网站都有菜单。创建一个menu标记并使用它:

    {% load my_tags %} <!-- don't forget to load your tags first -->
    <html>
    
        {% menu %} <!-- your menu will be rendered here -->
    
        <div id = 'content'>
        blah
        </div>
    </html>
    

    您的代码甚至可以在模板上下文中添加新变量:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#setting-a-variable-in-the-context