2013-03-04 8 views
3

Есть ли простой тег django для получения первых символов x строки в шаблоне?django получить первую часть строки

В списке моделей, я хотел бы указать другой символ на предмет объекта, в зависимости от состояния объекта. Статус может быть «ожидающим», «успешным» или «неудачным XXXX», причем XXXX является кодом ошибки.

Я хотел бы проверить, если первые 5 символов объектаinstance.status == 'error', тогда символ будет красным. Однако как я могу это сделать? В Python я мог бы использовать objectinstance.status [: 5].

Использование https://docs.djangoproject.com/en/dev/ref/templates/builtins/ Мне удалось сделать это с помощью следующей «монструальной» конкатенации, но есть ли что-то простое, как .left() или .right()?

{% if run.status|make_list|slice:":5"|join:"" == 'error' %} 

ответ

4

Вы можете попробовать:

{% if run.status|truncatechars:5 == 'error...' %} 

(см truncatechars в документации Django)

Хотя я мог бы сказать, в качестве общей точки, вы не должны помещать такой логики в ваших шаблонах Django (представления в других рамках). Вы хотите поместить это в представление Django (контроллер в других фреймворках). Значение, вы бы что-то подобное на ваш взгляд:

has_error = run.status.startswith('error') 

Обеспечение has_error передается в шаблон и:

{% if has_error %} 

Это может быть больше работы, но логика для обнаружения состояния ошибки могут совместно между несколькими видами и шаблонами, и вы отделяете логику управления от логики представления.

0

Если вы используете Django 1.4+, вы можете использовать тег truncatechars, но он частично разрешит ваш ответ и добавит многоточие в конце.

Единственный жизнеспособный способ, часть из конкатенирования многих фильтров, как вы уже делали, заключается в создании настраиваемого фильтра. Вот первый проект вы можете настроить:

from django import template 
from django.template.defaultfilters import stringfilter 

register = template.Library() 

@register.filter 
@stringfilter 
def slicestring(value, arg): 
    """usage: "mylongstring"|slicestring:"2:4" """ 
    els = map(int, arg.split(':')) 
    return value[els[0]:els[1]] 

в качестве бонуса этого фильтр позволяет имитировать практически полностью среза обозначение, предоставляя «нарезки строки» в качестве аргумента. Единственное исключение, кажется, синтаксис [:9], который должен быть заменен [0:9], таким образом, с этим аргументом: yourvariable|slicestring:"0:9"

примечания стороны: Так как ваш вопрос «получением первой части строки» Я считаю, что пользовательский фильтр может быть правильным ответом, однако, если единственная причина получить нарезанную строку - проверить часть ее внутри инструкции if, тогда я должен согласиться с Антоном: вы должны поместить свои проверки внутри представления, а не внутри шаблона, когда возможно.

Смежные вопросы