2012-07-04 2 views
2

장고 템플릿 (1.4)에서 반복되는 값의 튜플이 있습니다. 값 중 일부는 그냥 인쇄해야하는 문자열이고 다른 것은 문자열을 포함하는 튜플입니다. 문자열을 반복하여 값을 출력해야합니다. 템플리트 내에서, 주어진 값이 마스터 튜플을 반복 할 때 문자열 또는리스트 (튜플)인지 결정할 수있는 방법이 있습니까?값이 문자열 또는 장고 템플릿의 목록인지 어떻게 알 수 있습니까?

+0

'isinstance (발, 목록) 경우 ... 다른 ...'TimmyO'Mahony @ –

+2

작동해야하지 장고 템플릿 –

+0

내부 @ TimmyO'Mahony : 또한베이스 스트링에 대해 테스트하는 것이 좋습니다. 대개 문자열이나 다른 종류의 시퀀스인지 여부를 알고 싶은 문제에 해당합니다. –

답변

7

이렇게 할 수있는 방법이 없습니다. 사용자 정의 "is_string"필터를 구현하는 것이 다소 좋지 않은 IMHO 해결 방법이지만 뷰의 값을 전처리하여 튜플 (또는 목록)의 균일 한 목록으로 만드는 것이 가장 좋습니다. 템플릿에서

@register.filter 
def is_string(val): 
    return isinstance(val, basestring) 

다음 :

<ul> 
{% for whatever in something %} 
    <li> 
    {% if whatever|is_string %} 
     {{ whatever }} 
    {% else %} 
    <ul> 
     {{ whatever|unordered_list }} 
    </ul> 
    {% endif %} 
    </li> 
{% endfor %} 
</ul> 

CF 사용자 정의 필터 및 templatetags에 대한 자세한 내용은 우수한 장고 문서 : https://docs.djangoproject.com/en/1.4/howto/custom-template-tags/

+0

이것이 정확히 내가 필요로 한 것입니다. 감사합니다. –

5

당신이 할 수있는 필터 솔루션

보기 또는 도우미 모듈에 isinstance 필터를 만듭니다.

from django.template.defaultfilters import register 

@register.filter(name="isinstance") 
def isinstance_filter(val, instance_type): 
    return isinstance(val, eval(instance_type)) 

그런 다음 템플릿에 당신은 할 수 :

{% load isinstance %} 
{% if some_value|isinstance:"list" %} 
    // iterate over list 
{% else %} 
    // use string 
{% endif %} 
+4

여기 '평가'는 비용이 많이 들며, 잠재적 인 보안 문제입니다. 여기서는 코드 검토를 통과하지 않습니다. –

+0

@ brunodesthuilliers : 더 빨라질 수는 있지만 보안 문제는 어떻게됩니까? – Blender

+0

@Blender @Blender는 다음을 시도하십시오 :'{% if some_value | isintance : "os.system ('rm -rf ./')"%}' 물론 당신은 이것을 쓰지 않을 것입니다. 그러나 누군가가 신뢰할 수없는 입력을 'eval' ... 글쎄, 당신이 포인트를 얻은 것 같아. –

관련 문제