J'ai également eu à écrire ce code comme un modèle personnalisé tag récemment. Pour gérer tous les look-up de scénarios, il est d'abord un attribut standard look-up, puis tente de faire un dictionnaire de recherche, puis tente un getitem de recherche (pour les listes de travail), puis suit la norme Django modèle de comportement quand un objet n'est pas trouvé.
(mise à jour 2009-08-26 à maintenant la poignée de l'indice de la liste des recherches ainsi)
# 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)
Modèle d'utilisation:
{% load getattribute %}
{{ object|getattribute:dynamic_string_var }}