Я также получил write this code в качестве пользовательского тега шаблона. Чтобы обрабатывать все сценарии поиска, он сначала выполняет поиск стандартного атрибута, затем пытается выполнить поиск по словарю, затем пытается найти getitem (для работы списков), затем следует стандартное поведение шаблона Django, когда объект не найден.
(обновлена 2009-08-26 в настоящее обрабатывать Lookups индекса списка, а) использование
# app/templatetags/getattribute.py
import re
from django import template
from django.conf import settings
numeric_test = re.compile("^\d+$")
register = template.Library()
def getattribute(value, arg):
"""Gets an attribute of an object dynamically from a string name"""
if hasattr(value, str(arg)):
return getattr(value, arg)
elif hasattr(value, 'has_key') and value.has_key(arg):
return value[arg]
elif numeric_test.match(str(arg)) and len(value) > int(arg):
return value[int(arg)]
else:
return settings.TEMPLATE_STRING_IF_INVALID
register.filter('getattribute', getattribute)
Шаблон:
{% load getattribute %}
{{ object|getattribute:dynamic_string_var }}
Интересно, пытаетесь ли вы сделать слишком много в своих шаблонах. getattr иногда чувствует себя как черная магия в коде Python, так что это, безусловно, запах кода в шаблоне! –