【问题标题】:How can I access the view function in a Django template tag?如何访问 Django 模板标签中的视图功能?
【发布时间】:2011-02-03 21:02:32
【问题描述】:

罐头上写着什么:我希望能够访问:

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

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

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

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

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

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

    基本上有 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>
    

    【讨论】:

    • 这里唯一棘手的部分是模板的性质;有问题的帮助链接位于基本模板中,因此我需要传入视图的名称。把它放在几十个视图的上下文中是一件很痛苦的事情。在我看来,必须有更好的方法来做到这一点。
    • 不,在这种情况下,您创建一个帮助块:{% block help %}{% endblock help %}。然后将该块放入每个模板中。由于每个视图的模板(我希望!)都不同,因此您可以指定哪些帮助内容应直接显示在该块中。
    【解决方案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 中没有任何特殊状态。

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

      【讨论】:

        【解决方案4】:

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

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

        Definition of Context Processors

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-16
          • 2013-07-16
          • 2011-01-10
          • 2018-07-01
          • 2019-03-10
          • 2012-01-24
          • 2011-04-15
          • 1970-01-01
          相关资源
          最近更新 更多