如何在Django模板标签中访问视图函数?

0 投票
4 回答
3554 浏览
提问于 2025-04-16 11:11

这段话的意思是:我想要能够访问以下内容:

  • 视图函数本身
  • 视图的名称(虽然这个用处不大,但我可能可以用它找到函数)
  • 视图函数的属性

这些内容需要在模板标签中访问。

简单来说,我想给视图函数添加一些信息,这些信息可以被我的基础模板用来配置一些视图的界面,比如设置标题,或者填充一个通用的帮助对象。如果有人能提供更好的方法来实现这个目标,请随时分享你的建议。

4 个回答

1

在Django中,视图函数并没有什么特别的地位。

模板可以在任何地方被渲染:可以在视图中、在模板标签中、在模型方法中,甚至在一些工具函数里……所以其实不太清楚你想要访问什么。不过总的来说,如果你想在模板中使用某些东西,最好是把它传递到模板的上下文中。

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',
     )
3

是的,当你第一次使用Django时,有时候你需要改变一下自己对设计的思考方式,尤其是如果你之前用的是像PHP、ColdFusion这样的语言,这些语言的很多功能都是在模板里面实现的。

简单来说:不要试图在Django模板中实现复杂的编程逻辑。在模板中,if/then/else和循环基本上是你能做的复杂度的上限。

在模板中生成输出主要有三种方法:

  1. 在视图函数中创建内容。这通常是最常见的方法。几乎所有的查询都会在视图中设置(虽然因为它们是“惰性”的,通常在模板中调用时才会执行)。对象、字典、列表、元组和简单字符串都可以在视图中创建,然后发送到模板中,并通过Django的点表示法访问。有些人会选择性地发送他们想要的变量,通常使用一个叫做context的字典来传递。一个简单(虽然不太精确)的方法是直接发送locals(),这样会把函数中创建的每个变量(以及参数)都发送过去。
  2. 通过在发送到模板的对象中实现一个函数。比如说,你为一个模型定义了一个函数。如果你为Author模型创建了一个most_recent_posts函数,你可以这样使用:{% for post in author.most_recent_posts %}
  3. 使用自定义标签和模板。当需要对变量进行处理或格式化,而在视图函数中处理不太合适时,这通常是必要的。虽然过滤器(功能:接受一个输入,修改它[如果需要的话加一个参数]并返回)很简单易开发,但标签可能会复杂一些。

例如,如果你想在页面上创建一个“帮助对象”,你可能会对一种特殊的自定义标签感兴趣,叫做包含标签。你可以像调用普通自定义标签一样调用它:{% 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>

撰写回答