Index: turbogears/widgets/tests/test_datagrid.py
===================================================================
--- turbogears/widgets/tests/test_datagrid.py	(revision 7036)
+++ turbogears/widgets/tests/test_datagrid.py	(working copy)
@@ -109,3 +109,40 @@
             (44, "Pablo Martelli", "Brazil")]
         output = grid.render(data)
         assert '<td>Joe Doe</td><td>Great Britain</td><td>23</td>' in output
+
+    def test_another_attrwrapper_implementation(self):
+        class TestDataGrid(DataGrid):
+            class attrwrapper(object):
+                def __init__(self, name):
+                    self.name = int(name)
+        grid = TestDataGrid(fields=[
+            ('Field 1', 0)
+        ])
+        assert isinstance(grid.columns[0].getter, TestDataGrid.attrwrapper)
+
+    def test_attrwrapper_with_list(self):
+        grid = DataGrid(fields=[
+            ('Field 1', 0),
+            ('Field 2', 1)
+        ])
+        row = [0, 1]
+        assert grid.columns[0].getter(row) == 0
+        assert grid.columns[1].getter(row) == 1
+    
+    def test_attrwrapper_with_tuple(self):
+        grid = DataGrid(fields=[
+            ('Field 1', 0),
+            ('Field 2', 1)
+        ])
+        row = (0, 1)
+        assert grid.columns[0].getter(row) == 0
+        assert grid.columns[1].getter(row) == 1
+    
+    def test_attrwrapper_with_dict(self):
+        grid = DataGrid(fields=[
+            ('Field 1', 'key1'),
+            ('Field 2', 'key2')
+        ])
+        row = dict(key1='val1', key2='val2')
+        assert grid.columns[0].getter(row) == row['key1']
+        assert grid.columns[1].getter(row) == row['key2']
Index: turbogears/widgets/datagrid.py
===================================================================
--- turbogears/widgets/datagrid.py	(revision 7036)
+++ turbogears/widgets/datagrid.py	(working copy)
@@ -39,16 +39,20 @@
           - options, which is a way to carry arbitrary user-defined data
 
         """
-        def __init__(self, name, getter=None, title=None, options=None):
-            if not name:
+        def __init__(self, name, getter=None, title=None, options=None, attrwrapper=None):
+            if name is None:
                 raise ValueError, 'name is required'
-            if getter:
+
+            if attrwrapper is None:
+                attrwrapper = DataGrid.attrwrapper
+
+            if getter is None:
+                self.getter = attrwrapper(name)
+            else:
                 if callable(getter):
                     self.getter = getter
                 else: # assume it's an attribute name
-                    self.getter = DataGrid.attrwrapper(getter)
-            else:
-                self.getter = DataGrid.attrwrapper(name)
+                    self.getter = attrwrapper(getter)
             self.name = name
             self.title = title is None and name.capitalize() or title
             self.options = options or {}
@@ -71,9 +75,15 @@
 
         """
         def __init__(self, name):
-            assert isinstance(name, str)
             self.name = name
+        
         def __call__(self, obj):
+            if isinstance(obj, (list, tuple)):
+                return obj[int(self.name)]
+
+            if isinstance(obj, dict):
+                return obj[self.name]
+
             for name in self.name.split('.'):
                 obj = getattr(obj, name)
             return obj
@@ -133,7 +143,7 @@
         names = set() # keep track of names to ensure there are no dups
         for n, col in enumerate(fields):
             if not isinstance(col, self.Column):
-                if isinstance(col, str) or callable(col):
+                if isinstance(col, (basestring, int)) or callable(col):
                     name_or_f = col
                     title = options = None
                 else:
@@ -143,7 +153,7 @@
                     except IndexError:
                         options = None
                 name = 'column-' + str(n)
-                col = self.Column(name, name_or_f, title, options)
+                col = self.Column(name, name_or_f, title, options, self.attrwrapper)
             if col.name in names:
                 raise ValueError('Duplicate column name: %s' % name)
             columns.append(col)

