2013-02-13 2 views
0

내 블로그의 태그 표시 형식을 지정하려고합니다. tag1, tag2, tag3 등을 나열 할 수 있습니다. 심지어 이것으로 마지막 쉼표를 제거하는 방법을 알아 냈습니다.loop.lenth ins jinja 2

{% if not forloop.last %}, {% endif %} 

내 질문은 ... "and"를 어떻게 처리합니까?

예 : tag1, tag2 및 tag3. 여기

규칙

이 개 태그의 경우 =없이 쉼표 분리에 있습니다. 3 개 이상의 태그 = 마지막에서 두 번째까지 "및" 은 쉼표가 아니며 목록의 끝에옵니다. 나는 기분이 사람이 가고있다

raise TemplateSyntaxError, "'if' statement improperly formatted" TemplateSyntaxError: 'if' statement improperly formatted

에서 물론

나는 이런 식으로 뭔가에 jinja2에 그 표시 규칙을 만들 수 있습니다 기대했다

...

{% if loop.index == forloop.last - 1 %}and {% endif %} 

,이 코드의 결과 앱에서이 작업을 수행하라는 의미입니다. 템플릿이 아닙니다.하지만 이유를 설명해주세요 ... 사용자 정의 필터로이 작업을 수행해야합니까?

+0

루프 내의 태그에 마크 업을 적용하거나 단순히 일반 텍스트 문자열을 생성합니까? –

답변

1

remove as much logic as possible from templates을 사용하는 것이 좋습니다. 프레젠테이션에 집중하고 페이지 렌더링 지점을 추가하지 않아도되지만 항상 경계선이 있습니다.

내장 된 join과 비슷한 맞춤 필터를 정의하면 훨씬 깨끗한 템플릿을 유지할 수 있습니다.

def join_tags(tags): 
    if not tags: 
     return '(no tags)' 
    elif len(tags) == 1: 
     return tags[0] 
    else: 
     return ', '.join(tags[:-1]) + ' and ' + tags[-1] 

app.jinja_env.filters['join_tags'] = join_tags 

템플릿 사용법 : 당신은 또한 필터 내에서 마크 업을 추가하는 경우

{{ tags|join_tags }} 

, 당신은에 safe 필터를 적용해야합니다 다음은 그 예 문자열을 일반 텍스트 태그 이름의 목록을 받아들이고 반환의 결과는 탈출하지 않을 것이다.

+0

저는 1 년 늦었습니다. 그러나 이것은 옳은 대답입니다. – jwogrady