Inoltre, come tag di un modello personalizzato, ho dovuto utilizzare anche lo write this code. Per gestire tutti gli scenari di ricerca, esegue prima una ricerca standard degli attributi, quindi cerca di cercare un dizionario, quindi prova una ricerca (per gli elenchi funzionanti), quindi segue il comportamento del modello Django standard quando un oggetto non trovato
(aggiornato 2009-08-26 per gestire ora le ricerche di indice lista pure) l'utilizzo
# 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:
{% load getattribute %}
{{ object|getattribute:dynamic_string_var }}
Mi chiedo se stai provando a fare troppo nei tuoi modelli. getattr a volte si sente come la magia nera in codice Python quindi è sicuramente un odore di codice in un modello! –