在 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 图表的工具提示问题