【问题标题】:Include a simple function inside Django HTML template在 Django HTML 模板中包含一个简单的函数
【发布时间】:2019-05-24 08:41:59
【问题描述】:

我目前有一个名为“版权”(动态版权消息)的函数,我正在尝试将其包含到我的基本 Django 模板中,如下所示:

def copyright():
   some code
   some more code
   print(finaloutput)

我将它放在我的 modules/utils.py 中,该目录位于我在静态目录中注册的资产目录中。

我希望能够直接在我的主模板文件夹中的顶级 base.html 中调用像 {{ copyright }} 这样的函数。

我已尽一切努力确保我加载静态文件时没有运气。我是不是走错了路?

【问题讨论】:

    标签: python django


    【解决方案1】:

    有多种方法可以实现您的最终目标,但您所做的任何事情都无法实现。

    你可以,

    1. Use template tags
    2. Use context processors,有几种不同的方式。
    3. 如果您使用来自 Django 的基于类的通用视图,请在模板中按原样使用 {{ view.function_name }}

    从我认为您设置的方式来看,最快的方法可能是在您的视图中传递一些上下文数据。

    如果您使用功能视图,您的代码可能如下所示:

    def my_view(request):
        def copyright():
            return "copyright 2018"
    
        return render('my_template.html', {'copyright': copyright})
    

    如果您使用基于类的通用视图,您可以简单地修改您的get_context_data

    class Home(TemplateView):
        def get_context_data(self, *args, **kwargs):
            ctx = super(TemplateView, self).get_context_data(self, *args, **kwargs)
            ctx['copyright'] = self.copyright()
            return ctx
    
        def copyright(self):
            return "copyright 2018"
    

    【讨论】:

      【解决方案2】:

      不幸的是,您在这里所做的几乎所有事情都是错误的。

      这与静态文件无关:正如您自己所说,这是一个动态函数,因此根据定义不是静态的。无论如何,您不能将 Python 代码放在您的资产目录中。最后,任何像这样的函数总是需要返回结果,而不是打印出来。

      你需要的是一个模板标签,你把它放在你应用的templatetags目录中,并通过装饰器注册:

      @register.simple_tag
      def copyright():
         some code
         some more code
         return finaloutput
      

      然后,在模板中加载标签并将其称为标签,而不是变量:

      {% load utils %}  # or whatever you called the file
      ...
      {% copyright %}
      

      the template tags docs

      【讨论】:

      • 非常感谢您为我指明了正确的方向。我能够使用您的示例并使其正常工作。对于来自其他语言并学习这个框架的我来说,这只是一个奇怪的事情。我最终创建了一个简单称为“标签”的应用程序,这样我就可以容纳 templatetags 文件夹并按照文档所述注册应用程序和标签。之前,我试图将标签保留在“app”文件夹之外,仅仅是因为在我的脑海中,逻辑应该让它们位于基本 html 所在的应用程序之上。但是,这非常有效。谢谢!
      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多