diff --git a/djblets/settings.py b/djblets/settings.py
index 8bc392c0d6289533d577b64fdd96685723aecedb..1acceefcf70732dadd477d8cdfaa29ff2db4818d 100644
--- a/djblets/settings.py
+++ b/djblets/settings.py
@@ -45,6 +45,8 @@ PIPELINE_JS = {
             'djblets/js/configForms/views/listItemView.js',
             'djblets/js/configForms/views/listView.js',
             'djblets/js/configForms/views/pagesView.js',
+            'djblets/js/configForms/views/tableItemView.js',
+            'djblets/js/configForms/views/tableView.js',
         ),
         'output_filename': 'djblets/js/config-forms.min.js',
     },
diff --git a/djblets/static/djblets/js/configForms/views/tableItemView.js b/djblets/static/djblets/js/configForms/views/tableItemView.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9a9ac73bfc1b47549c1da39421acf14574e39aa
--- /dev/null
+++ b/djblets/static/djblets/js/configForms/views/tableItemView.js
@@ -0,0 +1,19 @@
+/*
+ * Renders a ListItem as a row in a table.
+ *
+ * This is meant to be used with TableView. Subclasses will generally want
+ * to override the template.
+ */
+Djblets.Config.TableItemView = Djblets.Config.ListItemView.extend({
+    tagName: 'tr',
+
+    template: _.template([
+        '<td>',
+        ' <% if (editURL) { %>',
+        '  <a href="<%- editURL %>"><%- text %></a>',
+        ' <% } else { %>',
+        '  <%- text %>',
+        ' <% } %>',
+        '</td>'
+    ].join(''))
+});
diff --git a/djblets/static/djblets/js/configForms/views/tableView.js b/djblets/static/djblets/js/configForms/views/tableView.js
new file mode 100644
index 0000000000000000000000000000000000000000..dce29f013e7a1be2de90a5475f2e28e64b7a357c
--- /dev/null
+++ b/djblets/static/djblets/js/configForms/views/tableView.js
@@ -0,0 +1,13 @@
+/*
+ * A table-based view for a list of items.
+ *
+ * This is an extension to ListView that's designed for lists with multiple
+ * columns of data.
+ */
+Djblets.Config.TableView = Djblets.Config.ListView.extend({
+    tagName: 'table',
+
+    getBody: function() {
+        return this.$('tbody');
+    }
+});
