在Django HTML模板中包含一个简单的功能

时间:2018-12-25 22:42:04

标签: python django

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

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

我将其放在我的资产目录中的我的模块/utils.py中,该目录已在我的静态目录中注册。

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

我已尽一切努力来确保我顺利地加载了静态文件。我是用错误的方式来处理这个问题吗?

2 个答案:

答案 0 :(得分:1)

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

这与静态文件无关:正如您自己说的那样,这是一个动态函数,因此从定义上来说不是静态的。无论如何,您不能将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

答案 1 :(得分:0)

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

可以,

  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"