Python 在模板标记(Django)中获取模板名称

Python 在模板标记(Django)中获取模板名称,python,django,django-templates,Python,Django,Django Templates,是否有方法在模板标记中获取模板名称(正在解析)? 我读了搜索,什么也没找到,只有这篇以前的文章 这对我没有多大帮助,因为答案取决于settings.DEBUG是否为真,在我的情况下这是不可能的 我真的不知道从哪里开始,所以欢迎任何建议:) 编辑 所以基本上我想要的是创建一个可插入的标记,当它呈现时检查标记对象,这将是标记对象的源 class Tag(models.Model): template = models.CharFIeld(max_length=50) name =

是否有方法在模板标记中获取模板名称(正在解析)? 我读了搜索,什么也没找到,只有这篇以前的文章

这对我没有多大帮助,因为答案取决于settings.DEBUG是否为真,在我的情况下这是不可能的

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

编辑

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

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

如果有一个标记对象,那么它将显示所有插件对象,如果没有,它将创建一个与模板标记中提供的名称和模板名称唯一的标记对象,如果无法获取模板名称,那么我想我可以使其每个名称唯一。整个标记有点像占位符,对于那些熟悉django cms的人来说,你也许可以使用上下文处理器来实现这一点,但我不确定他们是否可以访问模板的名称

工作的方法是为您执行的呈现调用制作一个包装器。假设您当前正在执行以下操作:

from django.shortcuts import render
def index(request):
    return render(request, 'app/index.html', { 'foo': 'bar', })
如果为此创建自己的包装器,则可以在实际渲染之前将模板名称添加到字典中:

from django.shortcuts import render
def myrender(request, template, dictionary):
    dictionary.update({'template_name': template})
    return render(request, template, dictionary)
然后在视图中,按如下方式更改它(假设您将上述函数保存在
myutils.py
中,并且它在您的路径上可用):


#从django.shortcuts导入render查看源,而对象将有权访问模板名称(通过
.name
),此值永远不会传递给对象,因此模板标记不可用

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

正如丹尼尔·罗斯曼(Daniel Roseman)在评论中提到的那样,如果你能详细说明你真正想要实现的目标,也许有更好的方法来实现你想要的。无意冒犯,但这听起来可能是一个错误


出于学术上的兴趣,我很快就想知道这是否可能。就我所见,这是可能的,但不是没有改变或修补django源代码

注意:以下内容不是推荐的解决方案,仅提示实际工作可能需要什么。不用于生产代码

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

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

    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源代码从来都不是一个好的解决方案,而且在迁移到不同版本时会遇到各种各样的麻烦

    我怀疑,这是不可能的。据我所知,在解释标记之前,模板结构会被解析成一个树状模型。因此,我假设在执行templatetag时,您需要的信息丢失了。(这只是一个粗略的猜测,但我认为您应该规划一种替代方法;))您的实际用例是什么?我想有更好的方法来实现您想要的。谢谢,但由于这是一个需要访问的模板标记,我并不真正使用视图渲染功能,因为基本上我希望模板标记获取其模板名称并对其进行一些处理。我同意使用上下文处理器,但不知道如何获得名称:(如果你不呈现模板,你会如何使用它?我的意思是我不会是通过视图呈现模板的人,因为它是开源的。如果不修改至少一些python代码,我真的想不出一种方法来实现这一点:是视图本身,还是Shawn在回答中提到的Django源代码。我想这可以归结为d。)o对目标受众影响最小的人。。。?
    >>> from django.template import loader, Context
    >>> t = loader.get_template("test.html")
    >>> t.render(Context({}))
    u'\nTemplate name in caps: TEST.HTML\n'