Django: передача пользовательского тега параметра - PullRequest
0 голосов
/ 02 марта 2011

Я пытаюсь передать переменную из URL (а не строки запроса) в пользовательский тег, но похоже, что я получаю ValueError при преобразовании его в int.На первый взгляд кажется, что он представляет собой строку типа «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 Ответ

1 голос
/ 02 марта 2011

Проблема в том, что вы не разрешили переменные в значения, которые они содержат. Если вы добавите в свой метод некоторую регистрацию, вы увидите, что в этот момент projectId на самом деле является строкой "projectId", потому что именно так вы ссылались на нее в шаблоне. Вам нужно определить, что это экземпляр template.Variable, а затем разрешить его в методе Node render. См. документацию по разрешению переменных .

Однако, в зависимости от того, что вы на самом деле делаете в render, вам может оказаться проще вообще избавиться от класса Node и просто использовать декоратор simple_tag , который также не требуя отдельного узла, также получает переменные, уже разрешенные в качестве его параметров.

...