2014-11-21 212 views
1

我有一個工作的自定義模板標籤。我想讓我的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應用:

screenshot of flat page entry

注意,我確保我使用了我的特定頁面模板,而不是默認頁面。

要評估標籤I,請按照this SO answer中的步驟操作。在我嘗試評估我自己的自定義模板標籤之前,我使用內置的Django模板標籤和過濾器進行了測試,並且它的工作方式類似於魅力。以下是雙方的一個例子Django的內置模板過濾器(lower)和標籤(now):

Adding built-in template tags and filters to the flatpages content textarea

而且它是如何呈現:

The flatpage template tags rendered

然而,當我嘗試並輸入我自己的自定義模板標籤,我得到了可怕的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類沒有做我認爲正在做的事情?

在此先感謝!

回答

0

這在我眼中並不是一個合適的解決方案,但是現在我已經部署了一個解決方法。我結束了使用預先存在的Django Server Side Includes模板標籤{% ssi %}幷包括文件系統中的文件。我希望我的用戶能夠將文件包含在系統之外,但對於我的使用案例,我只能將包含Django安裝本地文件包含在內。

有人可能會爭辯說,我試圖做的事情本來就是不安全的,並且強制我的用戶只包含那些Django系統本地的文件更安全。它仍然不能回答我最初的問題,而是關於自定義模板標籤註冊和使用的問題,而不是實際的實際使用案例。