Мне также недавно пришлось написать этот код в виде пользовательского тега шаблона. Для обработки всех сценариев поиска сначала выполняется поиск по стандартным атрибутам, затем выполняется поиск по словарю, затем выполняется поиск getitem (для работы списков), затем следует стандартному Django поведение шаблона, когда объект не найден.
(обновлено 2009-08-26, чтобы теперь также обрабатывать поиск по списку)
# 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 }}