2010-05-05 28 views
5

Sử dụng các mẫu Django trong Google App Engine (trên Python), có thể so sánh biến mẫu với một số nguyên trong khối {% if %} không?Tôi có thể so sánh biến mẫu với số nguyên trong các mẫu Django/App Engine không?

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(...)) 

mẫu của tôi:

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

này thổi lên với 'if' statement improperly formatted.

Những gì tôi đã cố gắng để làm trong mẫu của tôi là xây dựng một đơn giản nếu/elif/else cây là đúng ngữ pháp để có thể nêu

#foo_count == 0: 
There are no foos. 

#foo_count == 1: 
There is one foo. 

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

Duyệt mẫu tài liệu Django (this link cung cấp in the GAE documentation dường như cho các phiên bản của Django mới hơn so với những gì được hỗ trợ trên GAE), dường như tôi chỉ có thể sử dụng toán tử boolean (nếu thực tế các toán tử boolean được hỗ trợ trong phiên bản cũ của Django) với chuỗi hoặc biến mẫu khác.

Không thể so sánh các biến với số nguyên hoặc không phải chuỗi với mẫu Django? Tôi chắc rằng có một cách dễ dàng để giải quyết vấn đề này - xây dựng chuỗi tin nhắn ở phía Python thay vì bên trong khuôn mẫu - nhưng điều này có vẻ như một thao tác đơn giản như vậy bạn phải có khả năng xử lý trong một mẫu .

Có vẻ như tôi nên chuyển sang một công cụ tạo khuôn mẫu nâng cao hơn, nhưng khi tôi mới sử dụng Django (mẫu hoặc bất kỳ phần nào của nó), tôi chỉ muốn một số xác nhận trước.

+0

Hệ thống mẫu webapp đến từ Django 0,96; tài liệu có tại http://www.djangoproject.com/documentation/0.96/ Phiên bản mới hơn của Django có sẵn trên App Engine, nhưng có thể khó khăn khi tải chúng khi sử dụng webapp thay vì toàn bộ khung công tác django. – geoffspear

Trả lời

4

Bạn đang có lẽ hầu hết sử dụng Django 0,96:

Môi trường App Engine Python bao gồm ba phiên bản của Django: 0.96, 1.0.2 và 1.1. Django 0.96 được bao gồm trong App Engine SDK và là phiên bản được nhập mặc định khi ứng dụng nhập gói django .

Nguồn: http://code.google.com/appengine/docs/python/tools/libraries.html#Django

Như xyld đã nói, bạn phải sử dụng ifequal templatetag, vì boolean operators được chỉ bao gồm trong phiên bản 1.2, mà hiện đang trong giai đoạn beta.

Các documentation for version 0.96 can be found here hoặc bạn cũng có thể sử dụng phiên bản 1.1:

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

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

Tất nhiên, bạn luôn có thể tải về toàn bộ dự án Django, và bao gồm nó trong thư mục cấp cao nhất của ứng dụng của bạn. Một số mẹo về cách thực hiện điều đó có thể được tìm thấy trong this article.

EDIT: Vì số ifequal không phù hợp với số nguyên, bạn có thể chuyển các biến bổ sung vào mẫu của mình.

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(...)) 

và trong mẫu:

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

hay:

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

Từ tài liệu của ifequal: "Chỉ có thể so sánh một đối số với các biến mẫu hoặc chuỗi.".Do đó nó có vẻ không phù hợp để được sử dụng để so sánh với một số nguyên (để kiểm tra độ dài của một danh sách) –

+0

Xin lỗi! Tôi đã chỉnh sửa câu trả lời của mình – jbochi

1

Django 1.2 cho phép các nhà khai thác == trong thẻ {% if %}. Nếu bạn cần so sánh hai số nguyên hoặc các mục khác, bạn luôn có thể sử dụng {% ifequal a b %}...{% endifequal %} trong các phiên bản cũ hơn của Django.

Tôi đoán là bạn đang đọc các tài liệu Phát triển (django 1.2), nhưng sử dụng django 1.1 hoặc 1.1.1

Tuy nhiên, nếu bạn cần làm {{ foo|length }} và so sánh sản lượng mà mẫu thẻ + bộ lọc, bạn sẽ không thể. Bạn sẽ cần sửa logic xem của mình để tính toán cho bạn để bạn có thể sử dụng nó trong mẫu.

Ngoài ra, tùy thuộc vào cách bạn đang sử dụng danh sách, bạn có thể nhìn vào for...empty:

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

+0

là loại logic này sẽ được coi là "quá phức tạp" trong bất kỳ loại động cơ templating Python nào, không chỉ? Bởi vì điều này có vẻ khá đơn giản với tôi - nó không giống như tôi đang cố gắng thực thi mã thực, chỉ một vài câu lệnh if. –

+0

nếu bạn chỉ đơn giản so sánh hai ints, nó không phức tạp, nhưng cũ hơn Django (trước 1.2, mà isnt chính thức phát hành) cần phải sử dụng '{% ifequal%}', hãy thử sử dụng ifequal và xem nếu nó hoạt động thay vì '{ % if 1 == 1%} ' – dlamotte

+0

Tài liệu phiên bản phát triển hiện tại" Chỉ có thể so sánh đối số với biến hoặc chuỗi mẫu ". –

1

Bạn đang sử dụng một mẫu biến có tên foo_list:

{% if foo_list == 1 %} 

nhưng không có biến đó trong mẫu mà mã của bạn tạo, chỉ foofoo_count.

+0

AFAIK, các khuôn mẫu mẫu không xác định là OK và chỉ bị bỏ qua. Đúng? Ít nhất, nó không phải là một lỗi cú pháp '... – dlamotte

+0

xin lỗi, đây là một lỗi đánh máy gây ra bởi tôi đang cố gắng lấy mã thực và câm nó xuống - hãy để tôi sửa lỗi đó. –

0

phải:

{% if foo_list == 1 %} 

sai:

{% if foo_list== 1 %} 
Các vấn đề liên quan