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

问题描述:

它在锡说什么:我希望能够访问或者:如何访问Django模板标签中的视图函数?

  • 视图功能本身
  • 视图名称(虽然这是用处不大,我也许可以用它来找回功能)视图函数的
  • 属性

这需要从一个模板标签内访问。

总之,我想要做的是标记视图函数的信息,可以使用我的基本模板来配置一些视图取景UI;例如设置标题或填充通用帮助对象。如果有人可以建议更好的方法来做到这一点,请随时提供该答案。

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

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

视图函数在Django中没有任何特殊的状态。

模板可以在任何地方渲染:在视图中,在模板标签内,在模型方法中,在实用函数中......所以它甚至不清楚你想要访问什么。但无论如何,总的原则是,如果你想访问模板中的某些东西,你应该将它传递给模板上下文。

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

简而言之:不要试图在django模板内实现任何复杂的编程逻辑。如果/ then/else和loops几乎是你应该尝试直接在模板中完成的复杂程度。

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

  1. 通过创建在视图函数的内容。这通常是最常见的方法。几乎所有查询都将在视图中设置(尽管它们是“lazy”,它们通常在模板内调用之前不会运行)。对象,字典,列表,元组和简单字符串都可以在视图中创建并发送到模板并使用Django's dot notation访问。有些人选择他们想要发送的变量并使用字典(通常称为context)发送它们。一个简单的(尽管较少歧视)选项只是发送locals(),它将通过函数中创建的每个变量(以及参数)发送。
  2. 通过在发送给模板的对象内实现一个函数。一个例子就是你为模型定义的一个函数。如果您为Author型号创建了功能most_recent_posts,则可以使用{% for post in author.most_recent_posts %}
  3. 之类的功能,通过使用custom tags and templates。当需要对变量进行处理或格式化时,这通常是必需的,并且在视图函数内执行该处理是没有意义的。尽管过滤器(函数:接受输入,如果你愿意,可以用一个参数进行修改并返回),并且很容易开发。标签可能更复杂。

你的目的,例如在页面上创建一个“帮助对象”,你可能有兴趣在一个特殊的被称为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> 
+0

这里唯一棘手的部分是模板的性质;有问题的帮助链接将在基础模板中进行,因此我需要传递视图的名称。把它放在几十个观点的背景下是对屁股的痛苦;在我看来,这样做肯定有更好的方法。 – 2011-02-03 23:33:17

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

它可以通过使用context_processors以更好的方式完成。该链接将为您提供所需信息的其余部分。如果有任何疑问,请随时沟通。

Definition of Context Processors