2011-03-02 2 views
0

URL에서 쿼리 문자열이 아닌 변수를 사용자 정의 태그로 전달하려고 시도하지만 int로 변환 할 때 ValueError가 발생하는 것 같습니다. 언뜻보기에 실제 정수 값 대신 "project.id"와 같은 문자열로 표시됩니다. 내가 아는 바로는 태그 매개 변수는 항상 문자열입니다. 내보기에서 매개 변수의 값을 인쇄하여 보내기 전에 매개 변수가 올바른 것으로 나타납니다. 그것은 단지 문자열 일지 모르지만 템플릿이 어쨌든 int로 변환한다면 중요하지 않다고 생각했습니다.django : 매개 변수를 사용자 정의 매개 변수로 전달합니다.

# 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의 인스턴스로 정의한 다음 Noderender 메소드에서 해결해야합니다. the documentation on resolving variables을 참조하십시오.

render에서 실제로 수행하는 작업에 따라 노드 클래스를 모두 없애고 별도의 노드가 필요하지 않고 simple_tag decorator을 사용하는 것이 더 쉽습니다. 그것의 매개 변수로 해결되었습니다.