diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py
index ff2df550..8b88fe13 100644
--- a/gluon/sqlhtml.py
+++ b/gluon/sqlhtml.py
@@ -71,6 +71,26 @@ def represent(field, value, record):
else:
raise RuntimeError("field representation must take 1 or 2 args")
+class CacheRepresenter(object):
+ def __init__(self):
+ self.cache = {}
+ def __call__(self, field, value, row):
+ cache = self.cache
+ if field not in cache:
+ cache[field] = {}
+ try:
+ nvalue = cache[field][value]
+ except KeyError:
+ try:
+ nvalue = field.represent(value, row)
+ except KeyError:
+ try:
+ nvalue = field.represent(value, row[field.tablename])
+ except KeyError:
+ nvalue = None
+ if isinstance(field, _repr_ref):
+ cache[field][value] = nvalue
+ return nvalue
def safe_int(x):
try:
@@ -2668,7 +2688,7 @@ class SQLFORM(FORM):
htmltable = TABLE(COLGROUP(*cols), THEAD(head))
tbody = TBODY()
numrec = 0
- repr_cache = {}
+ repr_cache = CacheRepresenter()
for row in rows:
trcols = []
id = row[field_id]
@@ -2688,21 +2708,7 @@ class SQLFORM(FORM):
maxlength = maxtextlengths.get(str(field), maxtextlength)
if field.represent:
if field.type.startswith('reference'):
- if field not in repr_cache:
- repr_cache[field] = {}
- try:
- nvalue = repr_cache[field][value]
- except KeyError:
- try:
- nvalue = field.represent(value, row)
- except KeyError:
- try:
- nvalue = field.represent(
- value, row[field.tablename])
- except KeyError:
- nvalue = None
- if isinstance(field, _repr_ref):
- repr_cache[field][value] = nvalue
+ nvalue = repr_cache(field, value, row)
else:
try:
nvalue = field.represent(value, row)