diff --git a/reviewboard/datagrids/views.py b/reviewboard/datagrids/views.py
index d78b27e0165365cddd6e906615d179162399f76d..c29ff96013f99a185d437c510cff994a11c842b3 100644
--- a/reviewboard/datagrids/views.py
+++ b/reviewboard/datagrids/views.py
@@ -1,3 +1,9 @@
+"""Views for the Review Board datagrids."""
+
+from __future__ import annotations
+
+from typing import Optional, TYPE_CHECKING, Type
+
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User
 from django.http import Http404
@@ -16,8 +22,23 @@ from reviewboard.reviews.models import Group, ReviewRequest
 from reviewboard.site.decorators import check_local_site_access
 from reviewboard.site.urlresolvers import local_site_reverse
 
+if TYPE_CHECKING:
+    from django.http import HttpRequest, HttpResponse
+    from djblets.datagrid.grids import DataGrid
+
+    from reviewboard.site.models import LocalSite
+
 
-def _is_datagrid_gridonly(request):
+#: The template used for rendering all datagrids.
+#:
+#: Version Added:
+#:     5.0.7
+_DATAGRID_TEMPLATE_NAME = 'datagrids/datagrid.html'
+
+
+def _is_datagrid_gridonly(
+    request: HttpRequest,
+) -> bool:
     """Return whether or not the current request is for an embedded datagrid.
 
     This method allows us to disable consent checks in
@@ -39,68 +60,101 @@ def _is_datagrid_gridonly(request):
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def all_review_requests(request,
-                        local_site=None,
-                        template_name='datagrids/datagrid.html'):
-    """Display a list of all review requests."""
+def all_review_requests(
+    request: HttpRequest,
+    *,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
+    """Display a list of all review requests.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
+    """
     datagrid = ReviewRequestDataGrid(
-        request,
-        ReviewRequest.objects.public(user=request.user,
-                                     status=None,
-                                     local_site=local_site,
-                                     with_counts=True,
-                                     show_inactive=True),
-        _("All Review Requests"),
+        request=request,
+        queryset=ReviewRequest.objects.public(
+            user=request.user,
+            status=None,
+            local_site=local_site,
+            with_counts=True,
+            show_inactive=True),
+        title=_("All Review Requests"),
         local_site=local_site)
-    return datagrid.render_to_response(template_name)
+
+    return datagrid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def dashboard(request,
-              template_name='datagrids/dashboard.html',
-              local_site=None):
+def dashboard(
+    request: HttpRequest,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
     """Display the dashboard.
 
     This shows review requests organized by a variety of lists, depending on
     the ``view`` GET parameter. Valid ``view`` parameters are:
-    * 'outgoing'
-    * 'to-me'
-    * 'to-group'
-    * 'starred'
-    * 'incoming'
-    * 'mine'
-    * 'overview'
+
+    * ``incoming``
+    * ``mine``
+    * ``outgoing``
+    * ``overview``
+    * ``starred``
+    * ``to-group``
+    * ``to-me``
 
     Args:
         request (django.http.HttpRequest):
             The HTTP request from the client.
 
-        template_name (unicode):
-            The template to render with the default :py:func:`render`
-            method.
-
         local_site (reviewboard.site.models.LocalSite, optional):
-            The optional local site.
+            The optional Local Site.
 
     Returns:
         django.http.HttpResponse:
         The rendered HTTP response for the datagrid. What datagrid is rendered
         depends on the ``view`` parameter.
     """
-    grid = DashboardDataGrid(request, local_site=local_site)
-    return grid.render_to_response(template_name)
+    grid = DashboardDataGrid(request=request,
+                             local_site=local_site)
+
+    return grid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def group(request,
-          name,
-          template_name='datagrids/datagrid.html',
-          local_site=None):
-    """Display a list of review requests belonging to a particular group."""
+def group(
+    request: HttpRequest,
+    *,
+    name: str,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
+    """Display a list of review requests belonging to a particular group.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        name (str):
+            The name of the review group to view.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
+    """
     # Make sure the group exists
     group = get_object_or_404(Group, name=name, local_site=local_site)
 
@@ -109,37 +163,71 @@ def group(request,
                       status=403)
 
     datagrid = ReviewRequestDataGrid(
-        request,
-        ReviewRequest.objects.to_group(name,
-                                       local_site,
-                                       user=request.user,
-                                       status=None,
-                                       with_counts=True),
-        _('Review requests for %s') % group.display_name,
+        request=request,
+        queryset=ReviewRequest.objects.to_group(
+            group_name=name,
+            local_site=local_site,
+            user=request.user,
+            status=None,
+            with_counts=True),
+        title=_('Review requests for %s') % group.display_name,
         local_site=local_site)
 
-    return datagrid.render_to_response(template_name)
+    return datagrid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def group_list(request,
-               local_site=None,
-               template_name='datagrids/datagrid.html'):
-    """Display a list of all review groups."""
-    grid = GroupDataGrid(request, local_site=local_site)
-    return grid.render_to_response(template_name)
+def group_list(
+    request: HttpRequest,
+    *,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
+    """Display a list of all review groups.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
+    """
+    grid = GroupDataGrid(request=request,
+                         local_site=local_site)
+
+    return grid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def group_members(request,
-                  name,
-                  template_name='datagrids/datagrid.html',
-                  local_site=None):
-    """Display a list of users registered for a particular group."""
+def group_members(
+    request: HttpRequest,
+    *,
+    name: str,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
+    """Display a list of users registered for a particular group.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        name (str):
+            The name of the review group to view.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
+    """
     # Make sure the group exists
     group = get_object_or_404(Group,
                               name=name,
@@ -149,30 +237,46 @@ def group_members(request,
         return render(request, 'datagrids/group_permission_denied.html',
                       status=403)
 
-    datagrid = UsersDataGrid(request,
-                             group.users.filter(is_active=True),
-                             _("Members of group %s") % name)
+    datagrid = UsersDataGrid(
+        request=request,
+        queryset=group.users.filter(is_active=True),
+        title=_('Members of group %s') % name)
 
-    return datagrid.render_to_response(template_name)
+    return datagrid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def submitter(request,
-              username,
-              grid=None,
-              template_name='datagrids/datagrid.html',
-              local_site=None):
+def submitter(
+    request: HttpRequest,
+    *,
+    username: str,
+    local_site: Optional[LocalSite] = None,
+    grid: Optional[str] = None,
+) -> HttpResponse:
     """Display a user's profile, showing their review requests and reviews.
 
-    The 'grid' parameter determines which is displayed, and can take on the
-    following values:
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+        grid (str):
+            The name of the datagrid to view.
+
+            This can be one of:
+
+            * ``review-request``
+            * ``reviews``
 
-        * 'reviews'
-        * 'review-requests'
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
     """
-    # Make sure the user exists
+    # Make sure the user exists.
     if local_site:
         try:
             user = local_site.users.get(username=username)
@@ -181,6 +285,8 @@ def submitter(request,
     else:
         user = get_object_or_404(User, username=username)
 
+    datagrid_cls: Type[DataGrid]
+
     if grid is None or grid == 'review-requests':
         datagrid_cls = UserPageReviewRequestDataGrid
     elif grid == 'reviews':
@@ -191,22 +297,40 @@ def submitter(request,
     datagrid = datagrid_cls(request, user, local_site=local_site)
     datagrid.tabs = [
         (UserPageReviewRequestDataGrid.tab_title,
-         local_site_reverse('user', local_site=local_site,
+         local_site_reverse('user',
+                            local_site=local_site,
                             args=[username])),
         (UserPageReviewsDataGrid.tab_title,
-         local_site_reverse('user-grid', local_site=local_site,
+         local_site_reverse('user-grid',
+                            local_site=local_site,
                             args=[username, 'reviews']))
     ]
 
-    return datagrid.render_to_response(template_name)
+    return datagrid.render_to_response(_DATAGRID_TEMPLATE_NAME)
 
 
 @check_login_required
 @check_local_site_access
 @valid_prefs_required(disable_consent_checks=_is_datagrid_gridonly)
-def users_list(request,
-               local_site=None,
-               template_name='datagrids/datagrid.html'):
-    """Display a list of all users."""
-    grid = UsersDataGrid(request, local_site=local_site)
-    return grid.render_to_response(template_name)
+def users_list(
+    request: HttpRequest,
+    *,
+    local_site: Optional[LocalSite] = None,
+) -> HttpResponse:
+    """Display a list of all users.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        local_site (reviewboard.site.models.LocalSite, optional):
+            The optional Local Site.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered HTTP response for the datagrid.
+    """
+    grid = UsersDataGrid(request=request,
+                         local_site=local_site)
+
+    return grid.render_to_response(_DATAGRID_TEMPLATE_NAME)
