Ich hatte auch write this code als benutzerdefinierte Vorlage Tag vor kurzem. Um alle Nachschlagszenarien zu behandeln, führt es zunächst eine Standardattributsuche durch, versucht dann, eine Wörterbuchsuche durchzuführen, und versucht dann, eine getitem Suche (für Listen zu arbeiten), folgt dann Standard-Django-Vorlagenverhalten, wenn ein Objekt wird nicht gefunden.
# 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)
Template Nutzung (aktualisiert 2009-08-26 jetzt Liste Indexsuchen als auch handhaben):
{% load getattribute %}
{{ object|getattribute:dynamic_string_var }}
Ich frage mich, ob Sie versuchen, zu viel in Ihren Vorlagen zu tun. getattr fühlt sich manchmal wie schwarze Magie im Python-Code an, also ist es sicher ein Code-Geruch in einer Vorlage! –