diff --git a/django-stubs/contrib/gis/admin/options.pyi b/django-stubs/contrib/gis/admin/options.pyi
index ecab4c4af..c19a058f0 100644
--- a/django-stubs/contrib/gis/admin/options.pyi
+++ b/django-stubs/contrib/gis/admin/options.pyi
@@ -1,10 +1,14 @@
-from typing import Any
+from typing import Any, ClassVar
 
 from django.contrib.admin import ModelAdmin
-from django.contrib.gis.forms import BaseGeometryWidget
+from django.contrib.gis.forms import OSMWidget
+from django.db.models import Field
+from django.forms.fields import Field as FormField
+from django.http import HttpRequest
 
-spherical_mercator_srid: int
+class GeoModelAdminMixin:
+    gis_widget: ClassVar[type[OSMWidget]]
+    gis_widget_kwargs: ClassVar[dict[str, Any]]
+    def formfield_for_dbfield(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> FormField: ...
 
-class GISModelAdmin(ModelAdmin):
-    gis_widget: BaseGeometryWidget
-    gis_widget_kwargs: dict[str, Any]
+class GISModelAdmin(GeoModelAdminMixin, ModelAdmin): ...
diff --git a/scripts/stubtest/allowlist.txt b/scripts/stubtest/allowlist.txt
index 75c82ff46..d7e4608eb 100644
--- a/scripts/stubtest/allowlist.txt
+++ b/scripts/stubtest/allowlist.txt
@@ -387,3 +387,6 @@ django.urls.resolvers.URLPattern.lookup_str
 django.urls.resolvers.URLResolver.url_patterns
 django.urls.resolvers.URLResolver.urlconf_module
 django.utils.connection.BaseConnectionHandler.settings
+
+# Potential stubtest bug with metaclass
+django.contrib.gis.admin.options.GeoModelAdminMixin.gis_widget
diff --git a/scripts/stubtest/allowlist_todo.txt b/scripts/stubtest/allowlist_todo.txt
index 7158e0a71..d22d2d158 100644
--- a/scripts/stubtest/allowlist_todo.txt
+++ b/scripts/stubtest/allowlist_todo.txt
@@ -225,7 +225,6 @@ django.contrib.flatpages.models.FlatPage.template_name
 django.contrib.flatpages.models.FlatPage.title
 django.contrib.flatpages.models.FlatPage.url
 django.contrib.gis.admin.GISModelAdmin
-django.contrib.gis.admin.GISModelAdmin.gis_widget
 django.contrib.gis.admin.ModelAdmin
 django.contrib.gis.admin.ModelAdmin.log_addition
 django.contrib.gis.admin.ModelAdmin.log_change
@@ -235,8 +234,6 @@ django.contrib.gis.admin.TabularInline
 django.contrib.gis.admin.action
 django.contrib.gis.admin.display
 django.contrib.gis.admin.options.GISModelAdmin
-django.contrib.gis.admin.options.GISModelAdmin.gis_widget
-django.contrib.gis.admin.options.GeoModelAdminMixin
 django.contrib.gis.admin.site
 django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.can_alter_geometry_field
 django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.empty_intersection_returns_none
diff --git a/scripts/stubtest/allowlist_todo_django50.txt b/scripts/stubtest/allowlist_todo_django50.txt
index b0a884779..d7e534f60 100644
--- a/scripts/stubtest/allowlist_todo_django50.txt
+++ b/scripts/stubtest/allowlist_todo_django50.txt
@@ -30,7 +30,6 @@ django.contrib.contenttypes.fields.GenericForeignKey.get_content_type
 django.contrib.contenttypes.fields.GenericForeignKey.get_prefetch_querysets
 django.contrib.contenttypes.prefetch
 django.contrib.gis.admin.OpenLayersWidget
-django.contrib.gis.admin.options.spherical_mercator_srid
 django.contrib.gis.admin.widgets
 django.contrib.gis.db.backends.spatialite.schema.SpatialiteSchemaEditor.alter_db_table
 django.contrib.gis.db.models.Case.allowed_default