django:传递自定义标签参数

时间:2011-03-02 16:50:38

标签: python django templatetag

我正在尝试将URL中的变量(不是查询字符串)传递给自定义标记,但看起来我在将其转换为int时遇到了ValueError。它乍一看似乎是以“project.id”之类的字符串形式出现而不是实际的整数值。据我所知,标签参数总是字符串。如果我在发送之前在视图中打印出参数的值,则表明它是正确的。它可能只是一个字符串,但我认为无论如何模板都要将它转换为int无关紧要,对吧?

# in urls.py
# (r'^projects/(?P<projectId>[0-9]+)/proposal', proposal_editor),
# projectId sent down in RequestContext as 'projectId'

# in template
# {% proposal_html projectId %}

# in templatetag file
from django import template

register = template.Library()

@register.tag(name="proposal_html")
def do_proposal_html(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
    tagName, projectId = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
    print(projectId)
    projectId = int(projectId)

    return ProposalHtmlNode(int(projectId))

class ProposalHtmlNode(template.Node):
    def __init__(self, projectId):
    self.projectId = projectId

1 个答案:

答案 0 :(得分:1)

问题只是您没有将变量解析为它们包含的值。如果您在方法中添加了一些日志记录,那么您会看到projectId实际上是字符串"projectId",因为这是您在模板中引用它的方式。您需要定义这是template.Variable的实例,然后在Node的{​​{1}}方法中解析它。请参阅the documentation on resolving variables

但是,根据您在render中实际执行的操作,您可能会发现更容易完全删除Node类并只使用simple_tag decorator,而不需要单独的Node还将已经解析的变量作为其参数。