diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py
index d14f3c3f..3efc0ea3 100644
--- a/gluon/sqlhtml.py
+++ b/gluon/sqlhtml.py
@@ -2743,7 +2743,11 @@ class SQLFORM(FORM):
if field.type == 'blob':
continue
if isinstance(field, Field.Virtual) and field.tablename in row:
- value = row[field.tablename][field.name]
+ try:
+ # fast path, works for joins
+ value = row[field.tablename][field.name]
+ except KeyError:
+ value = dbset.db[field.tablename][row[field.tablename][field_id]][field.name]
else:
value = row[str(field)]
maxlength = maxtextlengths.get(str(field), maxtextlength)