Django: передача пользовательского тега параметра
Я пытаюсь передать переменную из 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 ответ
Проблема в том, что вы не разрешили переменные в значения, которые они содержат. Если вы добавите в свой метод вход в систему, вы увидите, что в этот момент projectId
на самом деле строка "projectId"
потому что именно так вы указали это в шаблоне. Вы должны определить это экземпляр template.Variable
а затем разрешите это в Node
"s render
метод. Смотрите документацию по разрешению переменных.
Тем не менее, в зависимости от того, что вы на самом деле делаете в render
вам может быть легче вообще избавиться от класса Node и просто использовать simple_tag
декоратор, который не требует отдельного узла, также получает переменные, уже разрешенные в качестве его параметров.