如何在Django模板标签中访问视图功能?

时间:2011-02-03 21:02:32

标签: python django django-templates

它在锡上的内容:我希望能够访问:

  • 视图功能本身
  • 视图名称(虽然这不太有用,我可以用它来回到函数)
  • 视图功能的属性

这需要从模板标签中访问。

简而言之,我要做的是使用我的基本模板可以使用的信息来标记视图函数,以配置一些视图框架UI;例如,设置标题,或填充通用帮助对象。如果有人可以提出更好的方法,请随意提供答案。

4 个答案:

答案 0 :(得分:2)

这就是模板上下文字典所包含的内容。它应包含“标题,例如,或填充通用帮助对象。”

def myViewFunction( request ):
    # whatever
    return render_to_response( template,
        { 'title': "Title of this view's page",
          'help': someHelpObject, },
          'name': 'myViewFunction',
          'attribute': 'some attribute of myViewFunction',
     )

答案 1 :(得分:2)

是的,当你第一次实现Django时,你有时必须改变你对设计的看法,特别是如果你来自PHP,ColdFusion或其他基于标签的语言,其中许多功能来自在模板中。

简而言之:不要尝试在django模板中实现任何复杂的编程逻辑。 if / then / else和循环几乎是您应该在模板中直接尝试的复杂程度。

基本上有3种方法可以在模板中以编程方式生成输出:

  1. 通过在视图函数中创建内容。这通常是最常用的方法。几乎所有查询都将在视图中设置(虽然它们是“lazy”,但在模板中调用之前它们通常不会运行。对象,字典,列表,元组和简单字符串都可以在视图中创建并发送到模板并使用Django's dot notation进行访问。有些人会选择他们想要发送的变量并使用字典(通常称为context)来发送它们。一个简单(虽然不那么有区别)的选项只是发送locals(),它将发送通过函数内创建的每个变量(以及参数)。
  2. 通过在发送给模板的对象中实现一个函数。一个例子是您为模型定义的函数。如果您为most_recent_posts模型创建了一个函数Author,则可以使用{% for post in author.most_recent_posts %}
  3. 之类的内容
  4. 通过使用custom tags and templates。当需要对变量进行处理或格式化时,这通常是必要的,并且从视图函数中进行该处理是没有意义的。虽然过滤器(函数:接受输入,如果你愿意的话,用一个参数修改它并返回它)并且很容易开发。标签可能更复杂。
  5. 出于您的目的,例如要在页面上创建“帮助对象”,您可能会对称为inclusion tag的特殊自定义标记感兴趣。您将其称为普通自定义标记:{% show_help obj %}并创建一个用于输出该对象数据的模板。例如,假设您想要实现一个上下文相关的帮助系统,您只是希望它从数据库中提取帮助对象并输出它们。你这样就创建了一个标签:

    from help.models import Help
    @register.inclusion_tag('/help/help.html')
    def show_help(topic):
        help = Help.objects.get(topic__iexact=topic)
        return {
            'help': help
        }
    

    然后你会有一个输出帮助内容的模板:

    # /help/templates/help/help.html
    <div class="help-widget">
    <h2>{{ help.title }}</h2>
    <p>{{ help.content }}</p>
    </div>
    

    在模板中,您可以调用包含标记:

    <form><fieldset>Delete Project</fieldset>
    ...
    {% show_help "Deleting Project" %}
    </form>
    

答案 2 :(得分:1)

视图功能在Django中没有任何特殊状态。

模板可以在任何地方呈现:在视图中,在模板标签内,在模型方法中,在实用程序函数中......所以它甚至不清楚您想要访问的内容。但无论如何,一般原则是如果你想要访问模板中的某些东西,你应该把它传递给模板上下文。

答案 3 :(得分:0)

如果你需要传递一些每次重复的上下文,并且每次写入视图时都要在视图的上下文中提及。

使用context_processors可以更好地完成它。此链接将为您提供所需的其他信息。如果有任何查询,可以自由地进行通信。

Definition of Context Processors