diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 474c4226f8..0617ab91a8 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -92,6 +92,7 @@ FORMFIELD_FOR_DBFIELD_DEFAULTS = {
models.ImageField: {'widget': widgets.AdminFileWidget},
models.FileField: {'widget': widgets.AdminFileWidget},
models.EmailField: {'widget': widgets.AdminEmailInputWidget},
+ models.UUIDField: {'widget': widgets.AdminUUIDInputWidget},
}
csrf_protect_m = method_decorator(csrf_protect)
diff --git a/django/contrib/admin/static/admin/css/forms.css b/django/contrib/admin/static/admin/css/forms.css
index 5db927d6cf..62a093f952 100644
--- a/django/contrib/admin/static/admin/css/forms.css
+++ b/django/contrib/admin/static/admin/css/forms.css
@@ -353,7 +353,7 @@ body.popup .submit-row {
width: 2.2em;
}
-.vTextField {
+.vTextField, .vUUIDField {
width: 20em;
}
diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index 835e653ba6..32a1900cb1 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -351,6 +351,11 @@ class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
class_name = 'vBigIntegerField'
+class AdminUUIDInputWidget(forms.TextInput):
+ def __init__(self, attrs=None):
+ super().__init__(attrs={'class': 'vUUIDField', **(attrs or {})})
+
+
# Mapping of lower case language codes [returned by Django's get_language()]
# to language codes supported by select2.
# See django/contrib/admin/static/admin/js/vendor/select2/i18n/*
diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py
index 43cf9f4182..f7c2a7865c 100644
--- a/tests/admin_widgets/tests.py
+++ b/tests/admin_widgets/tests.py
@@ -408,6 +408,20 @@ class AdminURLWidgetTest(SimpleTestCase):
)
+class AdminUUIDWidgetTests(SimpleTestCase):
+ def test_attrs(self):
+ w = widgets.AdminUUIDInputWidget()
+ self.assertHTMLEqual(
+ w.render('test', '550e8400-e29b-41d4-a716-446655440000'),
+ '',
+ )
+ w = widgets.AdminUUIDInputWidget(attrs={'class': 'myUUIDInput'})
+ self.assertHTMLEqual(
+ w.render('test', '550e8400-e29b-41d4-a716-446655440000'),
+ '',
+ )
+
+
@override_settings(ROOT_URLCONF='admin_widgets.urls')
class AdminFileWidgetTests(TestDataMixin, TestCase):