在自定义模板标签中解析 Django 自定义模板标签

     2023-02-24     119

关键词:

【中文标题】在自定义模板标签中解析 Django 自定义模板标签【英文标题】:Parsing a Django custom template tag within a custom template tag 【发布时间】:2015-01-20 05:21:01 【问题描述】:

我有一个有效的自定义模板标签。我想允许我的 Django 管理界面用户将该模板标签放在一个平面页面中并让它正确呈现。但是,当尝试访问呈现的平面页面时,我收到 500 服务器错误。调试控制台打印TemplateSyntaxError: Invalid block tag: 'requesturl'。是否有某种我不知道的自定义模板标签加载优先级?

这是我的自定义模板标签:

from django import template
import requests

register = template.Library()

def getrequest(url):
    """
    Simple request object
    to GET another file
    """
    try:
        r = requests.get(url)
    except requests.exceptions.RequestException as e:
        raise IOError(e)
    except requests.exceptions.HTTPError as e:
        raise IOError(e)

    if r.status_code != 200:
        raise IOError('Non 200 response returned')
    else:
        return r.content

@register.tag(name="requesturl")
def do_requesturl(parser, token):
    """
    tag usage % requesturl object.textfield %
    """
    try:
        tag_name, uri = token.split_contents();
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single URI string argument" % token.contents.split()[0]
    if not (uri[0] == uri[-1] and uri[0] in ('"', "'")):
        raise template.TemplateSyntaxError("%r tag's URI should be in quotes" % tag_name)
    return RequestUrlNode(uri[1:-1])

class RequestUrlNode(template.Node):
    def __init__(self, uri):
        self.uri = uri

    def render(self, context):
        try:
            pagecontent = getrequest(self.uri)
            return pagecontent
        except template.VariableDoesNotExist, template.TemplateSyntaxError:
            return 'Error rendering', self.uri

我可以将它放到我的任何 Django 模板中,定义一个 URL(在模板本身中),它使用 requests 模块来获取指定网页的内容并将其呈现在模板中:

% extends "site_layout.html" %
% load requesturl %
% requesturl "http://textfiles.com/100/914bbs.txt" %

太好了。现在,下一步是我希望我的用户能够通过在flatpages.content 字段中添加模板标签来在默认的 Django 襟翼应用程序中执行此操作,如下面的屏幕截图所示:

请注意,我已确保我使用的是特定的平面页面模板,而不是默认模板。

为了评估标签,我按照this SO answer 中的步骤进行操作。在我尝试评估我自己的自定义模板标签之前,我使用内置的 Django 模板标签和过滤器进行了测试,它就像一个魅力。下面是 Django 内置模板过滤器 (lower) 和标签 (now) 的示例:

以及它是如何呈现的:

然而,当我尝试输入我自己的自定义模板标签时,我得到了可怕的TemplateSyntaxError: Invalid block tag: 'requesturl'。下面是我的平面解析模板标签:

from django import template

register = template.Library()

@register.tag(name="evaluate")
def do_evaluate(parser, token):
    """
    tag usage % evaluate object.textfield %
    """
    try:
        tag_name, variable = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
    return EvaluateNode(variable)

class EvaluateNode(template.Node):
    def __init__(self, variable):
        self.variable = template.Variable(variable)

    def render(self, context):
        try:
            content = self.variable.resolve(context)
            t = template.Template(content)
            return t.render(context)
        except template.VariableDoesNotExist, template.TemplateSyntaxError:
            return 'Error rendering', self.variable

我不知道为什么我可以分别做这两个部分,但是当我尝试将它们结合起来时,我得到了错误:

File "/path/to/virtualenv/lib/python2.7/site-packages/django/template/base.py", line 332, in invalid_block_tag
raise self.error(token, "Invalid block tag: '%s'" % command)
TemplateSyntaxError: Invalid block tag: 'requesturl'

我唯一能想到的是我的自定义模板标签没有在 Django 中注册,但是如果它直接嵌入到 flatpages 模板中为什么会起作用呢?是否有某种底层模板标签注册表,或者我的 EvaluateNode 类没有做我认为它正在做的事情?

提前致谢!

【问题讨论】:

【参考方案1】:

在我看来,这不是一个适当的解决方案,但它是我现在部署的一种解决方法。我最终使用了预先存在的 Django Server Side Includes 模板标签 % ssi % 并包含来自文件系统的文件。我曾希望我的用户能够包含系统外部的文件,但对于我的用例,我可以只包含 Django 安装的本地文件。

有人可能会争辩说,无论如何,我试图做的事情本质上是不安全的,强制我的用户只包含 Django 系统本地的那些文件要安全得多。它仍然没有回答我原来的问题,这个问题更多的是关于自定义模板标签的注册和使用,而不是关于实际的实际用例。

【讨论】:

django自定义模板标签中的访问请求,使用标签装饰器

】django自定义模板标签中的访问请求,使用标签装饰器【英文标题】:Accessrequestindjangocustomtemplatetags,usingthetagdecorator【发布时间】:2013-03-3021:19:42【问题描述】:有一个题目和题目相同的问题:Accessrequestindjangocustomtemplatetags建议... 查看详情

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

】Django如何将自定义变量传递给上下文以在自定义管理模板中使用?【英文标题】:Djangohowtopasscustomvariablestocontexttouseincustomadmintemplate?【发布时间】:2012-03-0211:10:22【问题描述】:我正在扩展change_list.html,我需要输出一个在setti... 查看详情

如何在自定义模板中使用 Django 的管理员布尔图标?

】如何在自定义模板中使用Django的管理员布尔图标?【英文标题】:HowtouseDjango\'sadminBooleaniconsinacustomtemplate?【发布时间】:2017-09-1718:47:18【问题描述】:我正在尝试构建一个django模板,该模板在某一时刻显示一个布尔变量。但... 查看详情

Request.GET 在自定义 HTML Django Rest Framework 渲染器模板中不可用

】Request.GET在自定义HTMLDjangoRestFramework渲染器模板中不可用【英文标题】:Request.GETnotavailableincustomHTMLDjangoRestFrameworkrenderertemplate【发布时间】:2021-04-0812:26:24【问题描述】:我有这个使用DjangoRestFramework的自定义HTML渲染器:fromrest... 查看详情

自定义 Django 模板标签未加载到模板中

】自定义Django模板标签未加载到模板中【英文标题】:CustomDjangoTemplateTagsnotbeingloadedintoTemplates【发布时间】:2017-07-2913:27:21【问题描述】:我已经在互联网上搜索了很长一段时间,但无法解决我的问题。我正在尝试在我的一个Dja... 查看详情

JQuery 在 Django 自定义模板标签的模板中不起作用

】JQuery在Django自定义模板标签的模板中不起作用【英文标题】:JQuerydoesn\'tworkinDjangocustomtemplatetag\'stemplate【发布时间】:2014-06-2722:18:36【问题描述】:我正在创建一个简单的自定义模板标签,它在调用时呈现它自己的模板。问题... 查看详情

django之博客系统:自定义模板标签

...也允许你创建自己的模板标签(template tags)来执行自定义的动作。当你需要在你的模板中添加功能而Django模板标签(template tags)的核心设置无法提供此功能的时候,自定义模板标签会非常方便Django提供了以下帮助函数(f 查看详情

如何在 Django 中测试自定义模板标签?

】如何在Django中测试自定义模板标签?【英文标题】:HowtotestcustomtemplatetagsinDjango?【发布时间】:2010-12-1320:34:23【问题描述】:我正在向Django应用程序添加一组模板标签,但我不确定如何测试它们。我已经在我的模板中使用了它... 查看详情

Django 变量直接替换在模板中,但不在自定义标签中

】Django变量直接替换在模板中,但不在自定义标签中【英文标题】:Djangovariablesubstitutedintemplatedirectlybutnotincustomtag【发布时间】:2015-09-0908:01:20【问题描述】:我创建了一个自定义标签,其工作方式类似于块标签:@register.tagdefda... 查看详情

django自定义模板标签和过滤器(代码片段)

...各种各样的,总有一款你cover不到。Django为我们提供了自定义的机制,可以通过使用Python代码,自定义标签和过滤器来扩展模板引擎,然后使用%load%标签。一、前置步骤Django对于自定义标签和过滤器是有前置要求的,首先一条就... 查看详情

Django 自定义模板标签不返回任何值

】Django自定义模板标签不返回任何值【英文标题】:DjangoCustomTemplateTagnotreturninganyvalue【发布时间】:2014-10-1710:06:05【问题描述】:我正在学习如何创建和使用自定义模板标签。officialdocumentation非常擅长描述如何添加模板标签功... 查看详情

Django - 自定义模板标签传递关键字参数

】Django-自定义模板标签传递关键字参数【英文标题】:Django-CustomTemplateTagpassingkeywordargs【发布时间】:2011-06-1705:57:38【问题描述】:如何创建自定义模板标签以在模板中使用关键字参数?custom_templates.pyfromdjangoimporttemplateregister=t... 查看详情

是否可以使用 django 的自定义模板标签在模板的其他块中插入代码?

】是否可以使用django的自定义模板标签在模板的其他块中插入代码?【英文标题】:Isitpossibletousedjango\'scustomtemplatetagstoinsertcodeinotherblocksinthetemplate?【发布时间】:2012-11-1710:48:12【问题描述】:我正在编写一个自定义模板标记,... 查看详情

在 Django 中自定义模板标签以过滤博客中的特色帖子

】在Django中自定义模板标签以过滤博客中的特色帖子【英文标题】:CustomizetemplatetagsinDjangotofilterfeatured_postsinablog【发布时间】:2019-01-2115:19:51【问题描述】:我从这篇文章中得到了提示CustomisingtagsinDjangotofilterpostsinPostmodel我已经... 查看详情

在自定义分类模板中获取自定义字段

】在自定义分类模板中获取自定义字段【英文标题】:Getcustomfieldsincustomtaxonomytemplate【发布时间】:2015-10-1521:53:32【问题描述】:我已经设法列出了自定义父分类的所有直系子级..ChocolatesMarshmallowsPopcorn..andsoon...下面的代码。<?... 查看详情

如何从 django-cms 自定义模板标签呈现占位符?

】如何从django-cms自定义模板标签呈现占位符?【英文标题】:Howtorenderplaceholdersfromadjango-cmscustomtemplatetag?【发布时间】:2013-10-1813:21:01【问题描述】:我制作了一个简单的模板标签来列出django-cms站点中的子页面。除了我无法在... 查看详情

django头像自定义模板标签

】django头像自定义模板标签【英文标题】:djangoavatarcustomtemplatetag【发布时间】:2011-03-3109:41:04【问题描述】:我的网站非常直观,我想利用整个网站的用户头像,所以我认为编写自定义模板标签是最好的方法。我的UserProfile与Us... 查看详情

如何在自定义 django 表单中隐藏 django 标签?

】如何在自定义django表单中隐藏django标签?【英文标题】:HowcanIhideadjangolabelinacustomdjangoform?【发布时间】:2012-09-1720:18:06【问题描述】:我有一个自定义表单,可以创建一个字段的隐藏输入:classMPForm(forms.ModelForm):def__init__(self,*... 查看详情