0

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
4

1 に答える 1

1

問題は、変数を変数に含まれる値に解決していないことです。メソッドに何らかのロギングを入れると、その時点projectIdで実際には string"projectId"であることがわかります。これは、テンプレートで参照した方法だからです。これが のインスタンスであると定義し、のメソッドtemplate.Variableで解決する必要があります。変数の解決に関するドキュメントを参照してください。Noderender

ただし、 で実際に行っていることによっては、 Node クラスを完全に削除してデコレータrenderのみを使用する方が簡単な場合があります。これにより、個別の Node が不要になるだけでなく、すでに解決されている変数がパラメータとして取得されます。simple_tag

于 2011-03-02T19:28:26.507 に答える