2010-05-05 2 views
5

Google App Engine (Python)에서 Django 템플릿을 사용하면 템플릿 변수를 {% if %} 블록의 정수와 비교할 수 있습니까?템플릿 변수를 Django/App Engine 템플릿의 정수와 비교할 수 있습니까?

views.py :

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     foo_list = db.GqlQuery(...) 
     ... 
     template_values['foos'] = foo_list 
     template_values['foo_count'] = len(foo_list) 
     handler.response.out.write(template.render(...)) 

내 템플릿 :

{% if foo_count == 1 %} 
    There is one foo. 
{% endif %} 

'if' statement improperly formatted와 불면.

은 내가 내 템플릿에서 할 시도하는 것은/ELIF/다른 나무 장고 템플릿 문서를 찾아

#foo_count == 0: 
There are no foos. 

#foo_count == 1: 
There is one foo. 

#else: 
There are {{ foos|length }} foos. 

을 진술 할 수있을 문법적으로 정확 할 경우 간단한을 구축했다 (this linkin the GAE documentation가 나타납니다 제공 Django의 버전이 GAE에서 지원되는 것보다 훨씬 더 새롭다), 문자열이나 다른 템플릿 변수로 부울 연산자 (실제로는 부울 연산자가이 이전 버전의 장고에서 지원되는 경우)를 실제로 사용할 수있는 것처럼 보입니다.

변수를 정수 또는 비 문자열과 장고 템플릿으로 비교할 수 있습니까?

나는 이것을 해결할 수있는 쉬운 방법이 있다고 확신합니다 - 템플릿 내에서보다는 파이썬 측에서 메시지 문자열을 작성했습니다 -하지만 이것은 템플릿에서 처리 할 수있는 간단한 조작처럼 보입니다 .

더 진보 된 템플릿 엔진으로 전환해야하는 것처럼 들리지만, 장고 (템플릿 또는 그 일부)를 처음 사용함에 따라 일부 확인을 먼저하고 싶습니다.

+0

webapp 템플릿 시스템은 Django 0.96; http://www.djangoproject.com/documentation/0.96/ Django의 최신 버전은 App Engine에서 사용할 수 있지만 전체 django 프레임 워크가 아닌 webapp를 사용할 때로드하는 것이 까다로울 수 있습니다. – geoffspear

답변

4

당신은 아마 장고 0.96을 사용하고 있습니다 : 0 :

앱 엔진 파이썬 환경 장고의 세 가지 버전을 포함합니다.96, 1.0.2 및 1.1. Django 0.96은 App Engine SDK에 포함되어 있으며 은 앱이 django 패키지를 가져올 때 으로 가져 오는 버전입니다.

출처 : xyld가 말한 것처럼 boolean operators 만 버전 1.2에 포함 되었기 때문에, 당신의 ifequal templatetag를 사용해야합니다 http://code.google.com/appengine/docs/python/tools/libraries.html#Django

, 즉 현재 베타 버전으로 제공되고 있습니다.

documentation for version 0.96 can be found here 또는 당신은 또한 버전 1.1을 사용할 수 있습니다

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

from google.appengine.dist import use_library 
use_library('django', '1.1') 

은 물론, 당신은 항상 응용 프로그램의 최상위 디렉토리에 전체 장고 프로젝트를 다운로드하고, 포함 할 수 있습니다. 그 방법에 대한 몇 가지 팁은 this article에서 찾을 수 있습니다.

수정 : ifequal은 정수에 적합하지 않으므로 템플릿에 추가 변수를 전달할 수 있습니다.

{% if one_foo %} 
    You have one foo. 
{% endif %} 

나 :

{% if foo_list %} 
    You have {{ foo_count }} foo{{foo_count|pluralize}}. 
{% else %} 
    You have no foos 
{% endif %} 
+0

ifequal의 문서에서 : "인수를 템플릿 변수 나 문자열과 비교하는 것만 가능합니다."따라서 정수 비교 (목록의 길이를 테스트)에 사용하기에는 적합하지 않습니다. –

+0

죄송합니다! 내 대답을 편집했습니다. – jbochi

1

장고 1.2는 태그의 == 연산자를 허용합니다. 두 개의 정수 또는 다른 항목을 비교해야하는 경우 Django의 이전 버전에서는 항상 {% ifequal a b %}...{% endifequal %}을 사용할 수 있습니다.

내 생각 엔 당신이 개발 문서를 (1.2 장고) 읽기,하지만 당신은 {{ foo|length }}을하고 해당 템플릿 태그의 출력을 비교해야하는 경우,

그러나 장고 1.1 또는 1.1.1을 사용하는 것입니다 + 필터를 사용하면 할 수 없습니다. 뷰 로직을 수정하여 템플릿에서 사용할 수있게해야합니다.

또한,이 목록을 사용하는 방법에 따라, 당신은 for...empty로 볼 수 있습니다 :

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for-empty

+0

이것은 어떤 종류의 Python 템플릿 엔진에서 "너무 복잡하다"고 간주되는 로직 유형입니다. 이것은 나에게 꽤 단순한 것처럼 보이기 때문에 - 실제 코드, if 문을 실행하려고하는 것처럼 보이지 않습니다. –

+0

단지 두 개의 int를 비교하는 중이라면, 복잡하지는 않지만 오래된 Django (1.2 이전 버전)는'{% ifequal %}'을 사용해야하고, ifequal을 사용하고'{% if { % if 1 == 1 %} ' – dlamotte

+0

현재 개발 버전 문서 상태 "템플릿 변수 또는 문자열과 인수를 비교하는 것만 가능합니다." –

1

당신은라는 이름의 템플릿 변수 foo_list 사용하지 않는 것 :

{% if foo_list == 1 %} 

을하지만 거기 코드에서 빌드하는 템플릿의 변수는 foofoo_count뿐입니다.

+0

AFAIK, 정의되지 않은 템플릿 변수가 좋으며 무시됩니다. 권리? 적어도 문법 에러가 아닙니다. ... – dlamotte

+0

죄송합니다. 이것은 실제 코드를 취하려고 노력하면서 오타가 되었기 때문에 해결하도록하겠습니다. –

0

권리 :

{% if foo_list == 1 %} 

잘못된 :

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     foo_list = db.GqlQuery(...) 
     ... 
     template_values['foos'] = foo_list 
     template_values['foo_count'] = len(foo_list) 
     template_values['one_foo'] = len(foo_list) == 1 
     handler.response.out.write(template.render(...)) 

및 템플릿에

{% if foo_list== 1 %} 
관련 문제