2010-08-12 2 views
0

У меня возникли проблемы с попыткой итерации по шаблону на двух измерениях одновременно.Spooky Custom Template Filter?

Основная ситуация объясняется здесь:

http://www.djangobook.com/en/2.0/chapter04/ (в яблоках, бананы индексы пример)

>>> from django.template import Template, Context 
>>> t = Template('Item 2 is {{ items.2 }}.') 
>>> c = Context({'items': ['apples', 'bananas', 'carrots']}) 
>>> t.render(c) 
u'Item 2 is carrots.' 

Если бы я хотел итерацию от 1 до 3 об этом с переменной «fruitstep», Я не могу сделать это в шаблоне:

{{items.fruitstep}} терпит неудачу и рассматривает длинные цепочки точек, эта концепция приведет к массовым требованиям итерации к шаблону. Но я не мог найти стандартный способ сделать это, и я не уверен, что это хорошая практика шаблонов.

Итак, я создал шаблон фильтра:

@register.filter 
def key2value(collection,key): 
    try: 
     return collection[unicode(key)] # It seems that my collection 
             # keys are in unicode... 
    except: 
     return "" 

Это кажется очень мощный фильтр. Это начало быть очень специфическим тегом, но я не мог придумать причины, чтобы не сделать его полностью общим.

Мне интересно, есть ли стандартный способ сделать это, и я изобрел колесо, или если этот код может сделать что-то, что может поставить под угрозу систему.

Спасибо!

+0

Я понимаю, что проблема безопасности связана с тем, что все, что вернулось, является безопасным для HTML. Я считаю, что, не изменяя никаких значений по умолчанию, он избежит возвращенной информации, но с таким фильтром было бы невозможно проверить, что элементы в коллекции безопасны ... – iJames

ответ

0

Нет, нет причин не делать этого в своем собственном приложении. Я часто делал аналогичные фильтры и фактически размещал очень похожий код здесь, отвечая на различные вопросы.

Трудно представить себе способ, с помощью которого поиск словарей мог бы нарушить работу системы. Эта функциональность не предоставляется по умолчанию в Django из-за первоначального желания иметь ограниченный язык шаблонов - возможно ли, чтобы этот конкретный фильтр был предоставлен с самого начала, но учитывая, что это не так, его вряд ли можно добавить Теперь.

+0

Спасибо! Я рад, что успокоился. Прочитав раздел о пользовательских фильтрах, кажется, что проблема заключается в ясности в том, чтобы сделать строки HTML безопасными. Мне кажется, что это сделало бы невозможным, чтобы я мог понять, как это пойдет по усмотрению программиста. Тем не менее, я думал об альтернативном разделителе для разделения групп точек. Я могу видеть добавление в средство рендеринга тегов возможности добавления нескольких точек, чтобы, возможно, разделить цепочку точек? thispoll.thechoices..forloop.counter или даже thispoll.thechoices..myselectlist..forloop.counter О, уже неоднозначным. Ну, вернемся к работе. – iJames