gpt4 book ai didi

python - 在模板标签中获取模板名称(Django)

转载 作者:太空狗 更新时间:2023-10-29 21:50:47 27 4
gpt4 key购买 nike

有没有办法在模板标签中获取模板名称(正在解析)?我已经阅读搜索并没有找到任何东西,只有这篇以前的帖子 Getting the template name in django template

这对我帮助不大,因为答案依赖于 settings.DEBUG 为真,而在我的情况下不可能。

我真的不知道从哪里开始,所以欢迎任何建议:)

编辑

所以基本上我想要的是创建一个可插入标签,当呈现时它会检查标签对象,这将是标签对象的源

class Tag(models.Model):
template = models.CharFIeld(max_length=50)
name = models.CharField(max_length=100)
plugins = models.ForeignKey(PluginBase)

如果有一个标签对象,那么它会显示所有插件对象,如果没有,它会创建一个标签对象,该标签对象对于模板标签中提供的名称和模板名称是唯一的,如果无法获取模板名称,那么我想我可以使每个名称唯一。对于熟悉 django-cms 的人来说,整个标签有点像占位符

最佳答案

查看源代码,而 Template对象将有权访问模板名称(通过 .name),此值永远不会传递给 Parser对象,因此不适用于模板标签。

有多种方法可以使模板名称对模板本身可用(通过将其添加到上下文中)但不在模板标签内。

正如 Daniel Roseman 在评论中提到的,如果您可以详细说明您实际想要实现的目标,那么可能有更好的方法来实现您想要的目标。没有冒犯,但这听起来像是一个 XY problem .


出于学术兴趣,我快速摆弄了一下,看看是否可行。据我所知,这是可能的,但并非没有更改或猴子修补 django 源代码。

注意:以下不是推荐的解决方案,只是暗示实际完成此工作可能需要什么。不得用于生产代码。

通过使用以下更改修改 django.template.base.py,我们将 .template_name 属性添加到解析器对象,使其可用于模板标签。

  1. Added optional arg to compile_string
  2. Added template name as extra attribute to parser
  3. Passed in the template name when calling compile_string()

为了测试这一点,我定义了以下标签,它只返回大写的模板名称:

from django.template.base import Node, Library
register = Library()

class TemplateNameNode(Node):
def __init__(self, template_name):
self.name = template_name

def render(self, context):
return self.name.upper()

@register.tag
def caps_template_name(parser, token):
return TemplateNameNode(parser.template_name)

和以下模板:

{% load mytags %}
Template name in caps: {% caps_template_name %}

这似乎在 ./manage.py shell 中测试时有效:

>>> from django.template import loader, Context
>>> t = loader.get_template("test.html")
>>> t.render(Context({}))
u'\nTemplate name in caps: TEST.HTML\n'

虽然这似乎可行,但我应该重申,手动修补 django 源代码绝不是一个好的解决方案,并且在迁移到不同版本时会遇到各种麻烦。

关于python - 在模板标签中获取模板名称(Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com