2014-07-17 3 views
0

내가 출력 배열입니다 태그 생성 된 배열 출력 작업 : 나는 템플릿에이 태그를 호출 할 때장고 템플릿 태그,

from django import template 
register = template.Library() 

def create_array(context): 
    output=[1,2,3,4] 
return output 

register.simple_tag(takes_context=True)(create_array) 

이 : {% load create_array %} {% create_array %}을, 배열이 인쇄되어 있습니다,하지만 그럴 수 없어 이 방법으로 각 요소에 액세스 :

{% load create_array %} 
{% for i in create_array %} {{i}} {% forend %} 

어떻게 각 요소에 액세스 할 수 있습니까?

템플릿 렌더링 중에 오류가 발생했습니다. 예외 값 : 'create_array'객체는 반복 할 수 없습니다.

추신 : 태그에 '컨텍스트'가 필요하므로 간단한 예를 썼습니다. 나는 사용하여 forloop에서 각 개체의 인덱스를 얻으려면 장고 버전 1.6.2

답변

1

@laffuste는 배열을 반복하기 전에 템플릿 변수에 배열을 저장하기 위해 as 명령을 사용해야한다는 점이 좋습니다. 이것이 정확하게 사실, 어떤 Assignment Tags을 위해 만들어졌다 - 그러나, 태그를 작성하는 약간 깔끔한 방법이있다 : 그것 뿐이다

from django import template 
register = template.Library() 

@register.assignment_tag(takes_context=True) 
def create_array(context): 
    return [1,2,3,4] 

- 할당 태그가 구문 분석의 불쾌한 작업을 수행하고 템플릿을 반환 -variable-friendly 출력.

{{ load my_custom_tags }} 

{% create_array as my_array %} 

{% for item in my_array %} 
    {{ item }} 
{% endfor %} 
+0

고맙습니다. 작동합니다. –

0

를 사용 해요 forloop.counter과 같이 :

{% load create_array %} 
{% for i in create_array %} 
    {{ forloop.counter }} 
{% forend %} 

당신이 어떤 수를 쳤을 때 당신이 뭔가를하고 싶은 경우

:

여기
{% for i in create_array %} 
    {% if forloop.counter == 1 %} 
     Do something with {{ i }}. 
    {% endif %} 
{% endfor %} 

가 forloop 카운터 장고 문서입니다 다음 forloop는 다음 코드를 사용

{{ load my_custom_tags }} 

{% create_array as my_array %} 

{% for item in my_array %} 
    {{ item }} 
{% endfor %} 

하지만 어쩌면 누군가가 가볍고 더 좋은 것을 함께 올 것이다 : 난 두려워

+0

내가 여전히 오류가 : 템플릿의 laffuste의 대답에 모두는 당신이 한 곳에서 다시 모든 그래서 재현 여기, 한 곳에서 모든 것을 할 수 있습니다 당신이 필요로했던 것과, 그러나 다만 때문에 정확하게 메시지는 다음과 같습니다. " 'create_array'객체가 반복 가능하지 않습니다." 이 오류는 템플리트 렌더링 중입니다. –

0

은 ... 템플릿에서

from django import template 
from django.template.base import TemplateSyntaxError 

register = template.Library() 

@register.tag(name='create_array') 
def create_array(parser, token): 

    class ArrayCreator(template.Node): 
     def __init__(self, var_name): 
      self.var_name = var_name # output variable 

     def render(self, context): 
      context[self.var_name] = [1, 2, 3, 4] # access to context 
      return '' 

    args = token.contents.split() # "create_array", "as", VAR_NAME 

    if len(args) != 3 or args[1] != 'as': 
     raise TemplateSyntaxError("'create_array' requires 'as variable' (got %r)" % args) 

    return ArrayCreator(args[2]) 

사용보다 더 간단한 방법이 없다?