Google appengine замена строки в файле шаблона - PullRequest
0 голосов
/ 13 сентября 2009

Я использую Google Appengine (Python, конечно :)), и я хотел бы сделать string.replace на строку из файла шаблона .

{% for item in items %}
  <p>{{ item.code.replace( '_', ' ' ) }}</p>
{% endfor %}

Но это не работает. Таким образом, мы не можем выполнить что-либо кроме базовых проверок в шаблонах ядра приложения. Это правильно?

<ч />

Еще одна связанная проблема - я пытаюсь сократить строку и сделать ее доступной для шаблона.

Каждый предмет мебели имеет имя и более длинное поле description . В этом представлении я выполняю рендеринг. Мне нужны только первые 50 символов поля description .

Итак, я попробовал что-то вроде

items = db.GqlQuery( 'select * from furniture' )

# <b>edit:  if you change the above line to</b>
# items = db.GqlQuery( 'select * from furniture' ).fetch( 1000 )
# the .fetch() command makes the addition of dynamic properties work!

for item in items :
  item.shortdescr = item.description[ 0:50 ]

# pass data off to template for rendering
self.response.out.write(
  template.render( 'furnitureAll.html', { 'items' : items } )
)

Шаблон идет


{% for item in items %}
  <p>{{ item.name }}</p>
  <p>{{ <b>item.shortdescr</b> }}</p>
  <!-- items.shortdescr does not exist here,
  probably because I did not .put() it previously. -->
{% endfor %}

Так как это не сработало, я попытался изменить Gql Query, чтобы вместо этого сократить строку. Но я быстро понимаю, что Gql не похож на SQL. Я пытаюсь писать запросы типа

select name,LEFT( description, 50 ) from furniture

с небольшим успехом

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

У меня мало опыта работы с Google AppEngine, но я понимаю, что он очень тесно связан с Django. Ваши шаблоны на самом деле не содержат код Python, даже если некоторые из структур, которые вы используете в них, выглядят так.

Оба ваших вопроса должны быть решены с помощью шаблонных фильтров. Если бы это был Django, я бы использовал что-то вроде этого для вашего второго вопроса:

{{ item.description|truncatewords:10 }}

Для вашего первого вопроса (замена строки) может не быть встроенного фильтра, который вы можете использовать для этого. Вам нужно будет написать свой собственный. Как то так;

from google.appengine.ext.webapp.template import create_template_register

register = create_template_register()

@register.filter
def replace_underscores(strng):
    return strng.replace('_', ' ')

Затем в вашем шаблоне вы можете сделать это:

{{ item.code|replace_underscores }}
1 голос
/ 13 сентября 2009

Помимо вызова без аргументов .fetch() в вашем коде, который, я считаю, не может сработать (вы ВСЕГДА должны передавать fetch аргумент - максимальное количество сущностей, которые вы готовы получить! ), Я не могу воспроизвести вашу проблему - назначение нового атрибута (включая атрибут, полученный путем обработки существующих) каждому элементу просто отлично работает в моих тестах.

Не могли бы вы воспроизвести наблюдаемую проблему как можно меньше и отредактировать свой вопрос, включив в него все соответствующие файлы, пожалуйста? Кажется, это единственный способ, которым мы могли бы помочь вам с вашей странной обнаруженной ошибкой!

Кстати, select name,LEFT( description, 50 ) или что-то из COURSE не будет работать в GQL - GQL, очень и очень явно, поддерживает ТОЛЬКО select * для получения целых сущностей или select __key__ для получения только ключей сущностей - это все; НЕТ селективности столбцов в выделенных, тем более каких-либо ОПЕРАЦИЯХ по ним! -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...