diff --git a/djblets/static/djblets/css/config-forms.less b/djblets/static/djblets/css/config-forms.less
index 6b11f94f7d7f1aa02c7035e5aa1a28f0996c9c62..4f282da5af9b0b8ba17729a4f1bc62d13ae8458f 100644
--- a/djblets/static/djblets/css/config-forms.less
+++ b/djblets/static/djblets/css/config-forms.less
@@ -352,7 +352,7 @@
     color: var(--ink-p-input-fg);
   }
 
-  label {
+  label:not(.ink-c-button__label) {
     display: block;
     margin: 0.25em 0;
   }
diff --git a/djblets/static/djblets/js/configForms/views/listItemView.ts b/djblets/static/djblets/js/configForms/views/listItemView.ts
index bd01c593cf802aee1c9ebd0540d09baf0c8650f1..826b61d8ac4e1c032340c562b5387007be755f2d 100644
--- a/djblets/static/djblets/js/configForms/views/listItemView.ts
+++ b/djblets/static/djblets/js/configForms/views/listItemView.ts
@@ -71,31 +71,26 @@ export class ListItemView<
     static actionHandlers: EventsHash = {};
     actionHandlers: EventsHash;
 
+    static modelEvents: EventsHash = {
+        'actionsChanged': 'render',
+        'change:itemState': '_onItemStateChanged',
+        'destroy': 'remove',
+        'request': 'showSpinner',
+        'sync': 'hideSpinner',
+    };
+
     /**********************
      * Instance variables *
      **********************/
 
     /** The parent element for the loading spinner. */
-    $spinnerParent: JQuery;
+    $spinnerParent: JQuery = null;
 
     /** The loading spinner. */
-    $spinner: JQuery;
+    $spinner: JQuery = null;
 
     /** The item state indicator. */
-    #$itemState: JQuery;
-
-    /**
-     * Initialize the view.
-     */
-    initialize() {
-        this.listenTo(this.model, 'actionsChanged', this.render);
-        this.listenTo(this.model, 'request', this.showSpinner);
-        this.listenTo(this.model, 'sync', this.hideSpinner);
-        this.listenTo(this.model, 'destroy', this.remove);
-
-        this.$spinnerParent = null;
-        this.$spinner = null;
-    }
+    #$itemState: JQuery = null;
 
     /**
      * Render the view.
@@ -103,7 +98,7 @@ export class ListItemView<
      * This will be called every time the list of actions change for
      * the item.
      */
-    onRender() {
+    protected onRender() {
         const model = this.model;
 
         this.$el
@@ -116,7 +111,6 @@ export class ListItemView<
         this.#$itemState =
             this.$('.djblets-c-config-forms-list__item-state');
 
-        this.listenTo(model, 'change:itemState', this._onItemStateChanged);
         this._onItemStateChanged();
 
         this.addActions(this.getActionsParent());
diff --git a/djblets/static/djblets/js/configForms/views/listView.ts b/djblets/static/djblets/js/configForms/views/listView.ts
index 62f1a890ddb199b062934ea0c481d13699817bdd..ee41427209bad3f7658c86971afe66747f247c3e 100644
--- a/djblets/static/djblets/js/configForms/views/listView.ts
+++ b/djblets/static/djblets/js/configForms/views/listView.ts
@@ -53,7 +53,7 @@ interface AddRemoveOptions {
 })
 export class ListView<
     TModel extends List = List,
-    TElement extends Element = HTMLUListElement,
+    TElement extends HTMLUListElement = HTMLUListElement,
     TExtraViewOptions extends ListViewOptions = ListViewOptions
 > extends BaseView<TModel, TElement, TExtraViewOptions> {
     static className = 'djblets-c-config-forms-list';
@@ -131,7 +131,7 @@ export class ListView<
      *
      * This will loop through all items and render each one.
      */
-    onRender() {
+    protected onRender() {
         this.$listBody = this.getBody();
 
         this.#renderItems();
diff --git a/djblets/static/djblets/js/configForms/views/pagesView.ts b/djblets/static/djblets/js/configForms/views/pagesView.ts
index c1efa20be25509cc9103da21f8b75e38ecd41347..d7fe49b02fd86da034b83bba8543a41765b5bccd 100644
--- a/djblets/static/djblets/js/configForms/views/pagesView.ts
+++ b/djblets/static/djblets/js/configForms/views/pagesView.ts
@@ -67,7 +67,7 @@ export class PagesView<
      * This will set the default page to be shown, and instruct Backbone
      * to begin handling the routing.
      */
-    onInitialRender() {
+    protected onInitialRender() {
         this._$pageNavs = this.$('.djblets-c-config-forms-page-nav__item');
         this._$pages = this.$('.djblets-c-config-forms-subpage');
 
diff --git a/djblets/static/djblets/js/configForms/views/tableView.ts b/djblets/static/djblets/js/configForms/views/tableView.ts
index 73b99f0e4f176faed923f5610c7e31db83771d29..30ec1938968efd5ee8963ca9090149e4800528e6 100644
--- a/djblets/static/djblets/js/configForms/views/tableView.ts
+++ b/djblets/static/djblets/js/configForms/views/tableView.ts
@@ -29,7 +29,7 @@ export class TableView extends ListView {
      * If the element does not already have a <tbody>, one will be added.
      * All items will go under this.
      */
-    onInitialRender() {
+    protected onInitialRender() {
         const $body = this.getBody();
 
         if ($body.length === 0) {
