在 Django HTML 模板中包含一个简单的函数

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

你可以,

    Use template tags。 Use context processors,有几种不同的方式。 如果您使用来自 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 所在的应用程序之上。但是,这非常有效。谢谢!

以上是关于在 Django HTML 模板中包含一个简单的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 django 模板中包含 javascript 的最佳实践

Django 模板中包含的 Pygal svg 图表的工具提示问题

django如何在模板中包含javascript

渲染视图在模板中包含 django 位置字段

如何在我的自定义小部件模板中包含内置的 django 小部件模板?

在我的 django 模板中包含 CSS 和 Javascript [重复]