我有一個工作的自定義模板標籤。我想讓我的Django管理界面用戶將該模板標籤放在一個flatpage中,並使其正確呈現。但是,當試圖訪問渲染的flatpage時,我得到一個500服務器錯誤。調試控制檯打印TemplateSyntaxError: Invalid block tag: 'requesturl'
。有沒有我不知道的自定義模板標籤加載優先級?解析自定義模板標籤內的Django自定義模板標籤
這裏是我的自定義模板標籤:
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
模塊GET的內容指定網頁並將其呈現在模板中:
{% extends "site_layout.html" %}
{% load requesturl %}
{% requesturl "http://textfiles.com/100/914bbs.txt" %}
太好了。現在,下一步是,我希望我的用戶能夠做到這一點在默認的Django通過下面的截圖中添加模板標籤中flatpages.content
場像flapages應用:
注意,我確保我使用了我的特定頁面模板,而不是默認頁面。
要評估標籤I,請按照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
類沒有做我認爲正在做的事情?
在此先感謝!