Browse Source

Changed django.forms.ValidationError imports to django.core.exceptions.ValidationError.

Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
François Freitag 5 years ago
parent
commit
9ef4a18dbe
48 changed files with 164 additions and 133 deletions
  1. 2 2
      django/contrib/admin/forms.py
  2. 9 8
      django/contrib/auth/forms.py
  3. 4 3
      django/contrib/flatpages/forms.py
  4. 1 1
      django/contrib/gis/db/backends/postgis/pgraster.py
  5. 5 4
      django/contrib/gis/forms/fields.py
  6. 2 1
      django/contrib/postgres/forms/jsonb.py
  7. 3 2
      docs/ref/forms/fields.txt
  8. 4 2
      docs/ref/forms/validation.txt
  9. 2 1
      docs/topics/auth/customizing.txt
  10. 2 2
      docs/topics/auth/default.txt
  11. 3 2
      docs/topics/forms/formsets.txt
  12. 3 2
      docs/topics/i18n/translation.txt
  13. 2 1
      tests/admin_inlines/admin.py
  14. 1 1
      tests/admin_views/admin.py
  15. 2 2
      tests/admin_views/custom_has_permission_admin.py
  16. 2 2
      tests/admin_views/forms.py
  17. 6 6
      tests/auth_tests/test_forms.py
  18. 2 1
      tests/forms_tests/field_tests/test_booleanfield.py
  19. 1 1
      tests/forms_tests/field_tests/test_charfield.py
  20. 2 1
      tests/forms_tests/field_tests/test_choicefield.py
  21. 2 1
      tests/forms_tests/field_tests/test_combofield.py
  22. 2 3
      tests/forms_tests/field_tests/test_datefield.py
  23. 2 1
      tests/forms_tests/field_tests/test_datetimefield.py
  24. 2 1
      tests/forms_tests/field_tests/test_decimalfield.py
  25. 2 1
      tests/forms_tests/field_tests/test_emailfield.py
  26. 2 1
      tests/forms_tests/field_tests/test_filefield.py
  27. 2 1
      tests/forms_tests/field_tests/test_filepathfield.py
  28. 2 1
      tests/forms_tests/field_tests/test_floatfield.py
  29. 2 1
      tests/forms_tests/field_tests/test_genericipaddressfield.py
  30. 2 3
      tests/forms_tests/field_tests/test_imagefield.py
  31. 2 1
      tests/forms_tests/field_tests/test_integerfield.py
  32. 2 1
      tests/forms_tests/field_tests/test_multiplechoicefield.py
  33. 1 1
      tests/forms_tests/field_tests/test_multivaluefield.py
  34. 2 1
      tests/forms_tests/field_tests/test_regexfield.py
  35. 2 1
      tests/forms_tests/field_tests/test_splitdatetimefield.py
  36. 2 1
      tests/forms_tests/field_tests/test_timefield.py
  37. 2 1
      tests/forms_tests/field_tests/test_typedchoicefield.py
  38. 2 1
      tests/forms_tests/field_tests/test_typedmultiplechoicefield.py
  39. 2 1
      tests/forms_tests/field_tests/test_urlfield.py
  40. 2 1
      tests/forms_tests/field_tests/test_uuidfield.py
  41. 2 1
      tests/forms_tests/tests/test_error_messages.py
  42. 1 1
      tests/forms_tests/tests/test_forms.py
  43. 2 1
      tests/forms_tests/tests/test_formsets.py
  44. 53 52
      tests/forms_tests/tests/test_input_formats.py
  45. 4 4
      tests/gis_tests/test_geoforms.py
  46. 1 1
      tests/model_forms/test_modelchoicefield.py
  47. 2 3
      tests/model_forms/tests.py
  48. 2 1
      tests/test_client/views.py

+ 2 - 2
django/contrib/admin/forms.py

@@ -1,5 +1,5 @@
-from django import forms
 from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
+from django.core.exceptions import ValidationError
 from django.utils.translation import gettext_lazy as _
 
 
@@ -19,7 +19,7 @@ class AdminAuthenticationForm(AuthenticationForm):
     def confirm_login_allowed(self, user):
         super().confirm_login_allowed(user)
         if not user.is_staff:
-            raise forms.ValidationError(
+            raise ValidationError(
                 self.error_messages['invalid_login'],
                 code='invalid_login',
                 params={'username': self.username_field.verbose_name}

+ 9 - 8
django/contrib/auth/forms.py

@@ -10,6 +10,7 @@ from django.contrib.auth.hashers import (
 from django.contrib.auth.models import User
 from django.contrib.auth.tokens import default_token_generator
 from django.contrib.sites.shortcuts import get_current_site
+from django.core.exceptions import ValidationError
 from django.core.mail import EmailMultiAlternatives
 from django.template import loader
 from django.utils.encoding import force_bytes
@@ -113,7 +114,7 @@ class UserCreationForm(forms.ModelForm):
         password1 = self.cleaned_data.get("password1")
         password2 = self.cleaned_data.get("password2")
         if password1 and password2 and password1 != password2:
-            raise forms.ValidationError(
+            raise ValidationError(
                 self.error_messages['password_mismatch'],
                 code='password_mismatch',
             )
@@ -127,7 +128,7 @@ class UserCreationForm(forms.ModelForm):
         if password:
             try:
                 password_validation.validate_password(password, self.instance)
-            except forms.ValidationError as error:
+            except ValidationError as error:
                 self.add_error('password2', error)
 
     def save(self, commit=True):
@@ -226,12 +227,12 @@ class AuthenticationForm(forms.Form):
         allow login by active users, and reject login by inactive users.
 
         If the given user cannot log in, this method should raise a
-        ``forms.ValidationError``.
+        ``ValidationError``.
 
         If the given user may log in, this method should return None.
         """
         if not user.is_active:
-            raise forms.ValidationError(
+            raise ValidationError(
                 self.error_messages['inactive'],
                 code='inactive',
             )
@@ -240,7 +241,7 @@ class AuthenticationForm(forms.Form):
         return self.user_cache
 
     def get_invalid_login_error(self):
-        return forms.ValidationError(
+        return ValidationError(
             self.error_messages['invalid_login'],
             code='invalid_login',
             params={'username': self.username_field.verbose_name},
@@ -354,7 +355,7 @@ class SetPasswordForm(forms.Form):
         password2 = self.cleaned_data.get('new_password2')
         if password1 and password2:
             if password1 != password2:
-                raise forms.ValidationError(
+                raise ValidationError(
                     self.error_messages['password_mismatch'],
                     code='password_mismatch',
                 )
@@ -392,7 +393,7 @@ class PasswordChangeForm(SetPasswordForm):
         """
         old_password = self.cleaned_data["old_password"]
         if not self.user.check_password(old_password):
-            raise forms.ValidationError(
+            raise ValidationError(
                 self.error_messages['password_incorrect'],
                 code='password_incorrect',
             )
@@ -429,7 +430,7 @@ class AdminPasswordChangeForm(forms.Form):
         password2 = self.cleaned_data.get('password2')
         if password1 and password2:
             if password1 != password2:
-                raise forms.ValidationError(
+                raise ValidationError(
                     self.error_messages['password_mismatch'],
                     code='password_mismatch',
                 )

+ 4 - 3
django/contrib/flatpages/forms.py

@@ -1,6 +1,7 @@
 from django import forms
 from django.conf import settings
 from django.contrib.flatpages.models import FlatPage
+from django.core.exceptions import ValidationError
 from django.utils.translation import gettext, gettext_lazy as _
 
 
@@ -38,12 +39,12 @@ class FlatpageForm(forms.ModelForm):
     def clean_url(self):
         url = self.cleaned_data['url']
         if not url.startswith('/'):
-            raise forms.ValidationError(
+            raise ValidationError(
                 gettext("URL is missing a leading slash."),
                 code='missing_leading_slash',
             )
         if self._trailing_slash_required() and not url.endswith('/'):
-            raise forms.ValidationError(
+            raise ValidationError(
                 gettext("URL is missing a trailing slash."),
                 code='missing_trailing_slash',
             )
@@ -60,7 +61,7 @@ class FlatpageForm(forms.ModelForm):
         if sites and same_url.filter(sites__in=sites).exists():
             for site in sites:
                 if same_url.filter(sites=site).exists():
-                    raise forms.ValidationError(
+                    raise ValidationError(
                         _('Flatpage with url %(url)s already exists for site %(site)s'),
                         code='duplicate_url',
                         params={'url': url, 'site': site},

+ 1 - 1
django/contrib/gis/db/backends/postgis/pgraster.py

@@ -1,6 +1,6 @@
 import struct
 
-from django.forms import ValidationError
+from django.core.exceptions import ValidationError
 
 from .const import (
     BANDTYPE_FLAG_HASNODATA, BANDTYPE_PIXTYPE_MASK, GDAL_TO_POSTGIS,

+ 5 - 4
django/contrib/gis/forms/fields.py

@@ -1,6 +1,7 @@
 from django import forms
 from django.contrib.gis.gdal import GDALException
 from django.contrib.gis.geos import GEOSException, GEOSGeometry
+from django.core.exceptions import ValidationError
 from django.utils.translation import gettext_lazy as _
 
 from .widgets import OpenLayersWidget
@@ -47,7 +48,7 @@ class GeometryField(forms.Field):
                 except (GEOSException, ValueError, TypeError):
                     value = None
             if value is None:
-                raise forms.ValidationError(self.error_messages['invalid_geom'], code='invalid_geom')
+                raise ValidationError(self.error_messages['invalid_geom'], code='invalid_geom')
 
         # Try to set the srid
         if not value.srid:
@@ -71,14 +72,14 @@ class GeometryField(forms.Field):
         # Ensuring that the geometry is of the correct type (indicated
         # using the OGC string label).
         if str(geom.geom_type).upper() != self.geom_type and not self.geom_type == 'GEOMETRY':
-            raise forms.ValidationError(self.error_messages['invalid_geom_type'], code='invalid_geom_type')
+            raise ValidationError(self.error_messages['invalid_geom_type'], code='invalid_geom_type')
 
         # Transforming the geometry if the SRID was set.
         if self.srid and self.srid != -1 and self.srid != geom.srid:
             try:
                 geom.transform(self.srid)
             except GEOSException:
-                raise forms.ValidationError(
+                raise ValidationError(
                     self.error_messages['transform_error'], code='transform_error')
 
         return geom
@@ -89,7 +90,7 @@ class GeometryField(forms.Field):
         try:
             data = self.to_python(data)
             initial = self.to_python(initial)
-        except forms.ValidationError:
+        except ValidationError:
             return True
 
         # Only do a geographic comparison if both values are available

+ 2 - 1
django/contrib/postgres/forms/jsonb.py

@@ -1,6 +1,7 @@
 import json
 
 from django import forms
+from django.core.exceptions import ValidationError
 from django.utils.translation import gettext_lazy as _
 
 __all__ = ['JSONField']
@@ -30,7 +31,7 @@ class JSONField(forms.CharField):
         try:
             converted = json.loads(value)
         except json.JSONDecodeError:
-            raise forms.ValidationError(
+            raise ValidationError(
                 self.error_messages['invalid'],
                 code='invalid',
                 params={'value': value},

+ 3 - 2
docs/ref/forms/fields.txt

@@ -18,8 +18,9 @@ other hooks.
 Although the primary way you'll use ``Field`` classes is in ``Form`` classes,
 you can also instantiate them and use them directly to get a better idea of
 how they work. Each ``Field`` instance has a ``clean()`` method, which takes
-a single argument and either raises a ``django.forms.ValidationError``
-exception or returns the clean value::
+a single argument and either raises a
+``django.core.exceptions.ValidationError`` exception or returns the clean
+value::
 
     >>> from django import forms
     >>> f = forms.EmailField()

+ 4 - 2
docs/ref/forms/validation.txt

@@ -305,6 +305,7 @@ don't want to put it into the general ``MultiEmailField`` class. Instead, we
 write a cleaning method that operates on the ``recipients`` field, like so::
 
     from django import forms
+    from django.core.exceptions import ValidationError
 
     class ContactForm(forms.Form):
         # Everything as before.
@@ -313,7 +314,7 @@ write a cleaning method that operates on the ``recipients`` field, like so::
         def clean_recipients(self):
             data = self.cleaned_data['recipients']
             if "fred@example.com" not in data:
-                raise forms.ValidationError("You have forgotten about Fred!")
+                raise ValidationError("You have forgotten about Fred!")
 
             # Always return a value to use as the new cleaned data, even if
             # this method didn't change it.
@@ -346,6 +347,7 @@ an error, you can raise a ``ValidationError`` from the ``clean()`` method. For
 example::
 
     from django import forms
+    from django.core.exceptions import ValidationError
 
     class ContactForm(forms.Form):
         # Everything as before.
@@ -359,7 +361,7 @@ example::
             if cc_myself and subject:
                 # Only do something if both fields are valid so far.
                 if "help" not in subject:
-                    raise forms.ValidationError(
+                    raise ValidationError(
                         "Did not send for 'help' in the subject despite "
                         "CC'ing yourself."
                     )

+ 2 - 1
docs/topics/auth/customizing.txt

@@ -1100,6 +1100,7 @@ code would be required in the app's ``admin.py`` file::
     from django.contrib.auth.models import Group
     from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
     from django.contrib.auth.forms import ReadOnlyPasswordHashField
+    from django.core.exceptions import ValidationError
 
     from customauth.models import MyUser
 
@@ -1119,7 +1120,7 @@ code would be required in the app's ``admin.py`` file::
             password1 = self.cleaned_data.get("password1")
             password2 = self.cleaned_data.get("password2")
             if password1 and password2 and password1 != password2:
-                raise forms.ValidationError("Passwords don't match")
+                raise ValidationError("Passwords don't match")
             return password2
 
         def save(self, commit=True):

+ 2 - 2
docs/topics/auth/default.txt

@@ -1508,12 +1508,12 @@ provides several built-in forms located in :mod:`django.contrib.auth.forms`:
             class PickyAuthenticationForm(AuthenticationForm):
                 def confirm_login_allowed(self, user):
                     if not user.is_active:
-                        raise forms.ValidationError(
+                        raise ValidationError(
                             _("This account is inactive."),
                             code='inactive',
                         )
                     if user.username.startswith('b'):
-                        raise forms.ValidationError(
+                        raise ValidationError(
                             _("Sorry, accounts starting with 'b' aren't welcome here."),
                             code='no_b_users',
                         )

+ 3 - 2
docs/topics/forms/formsets.txt

@@ -220,7 +220,7 @@ this management data, an exception will be raised::
     >>> formset.is_valid()
     Traceback (most recent call last):
     ...
-    django.forms.utils.ValidationError: ['ManagementForm data is missing or has been tampered with']
+    django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with']
 
 It is used to keep track of how many form instances are being displayed. If
 you are adding new forms via JavaScript, you should increment the count fields
@@ -261,6 +261,7 @@ Custom formset validation
 A formset has a ``clean`` method similar to the one on a ``Form`` class. This
 is where you define your own validation that works at the formset level::
 
+    >>> from django.core.exceptions import ValidationError
     >>> from django.forms import BaseFormSet
     >>> from django.forms import formset_factory
     >>> from myapp.forms import ArticleForm
@@ -277,7 +278,7 @@ is where you define your own validation that works at the formset level::
     ...                 continue
     ...             title = form.cleaned_data.get('title')
     ...             if title in titles:
-    ...                 raise forms.ValidationError("Articles in a set must have distinct titles.")
+    ...                 raise ValidationError("Articles in a set must have distinct titles.")
     ...             titles.append(title)
 
     >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet)

+ 3 - 2
docs/topics/i18n/translation.txt

@@ -454,6 +454,7 @@ integer as the ``number`` argument. Then ``number`` will be looked up in the
 dictionary under that key during string interpolation. Here's example::
 
     from django import forms
+    from django.core.exceptions import ValidationError
     from django.utils.translation import ngettext_lazy
 
     class MyForm(forms.Form):
@@ -463,7 +464,7 @@ dictionary under that key during string interpolation. Here's example::
         def clean(self):
             # ...
             if error:
-                raise forms.ValidationError(self.error_message % {'num': number})
+                raise ValidationError(self.error_message % {'num': number})
 
 If the string contains exactly one unnamed placeholder, you can interpolate
 directly with the ``number`` argument::
@@ -477,7 +478,7 @@ directly with the ``number`` argument::
         def clean(self):
             # ...
             if error:
-                raise forms.ValidationError(self.error_message % number)
+                raise ValidationError(self.error_message % number)
 
 
 Formatting strings: ``format_lazy()``

+ 2 - 1
tests/admin_inlines/admin.py

@@ -1,5 +1,6 @@
 from django import forms
 from django.contrib import admin
+from django.core.exceptions import ValidationError
 from django.db import models
 
 from .models import (
@@ -102,7 +103,7 @@ class TitleForm(forms.ModelForm):
         title1 = cleaned_data.get("title1")
         title2 = cleaned_data.get("title2")
         if title1 != title2:
-            raise forms.ValidationError("The two titles must be the same")
+            raise ValidationError("The two titles must be the same")
         return cleaned_data
 
 

+ 1 - 1
tests/admin_views/admin.py

@@ -223,7 +223,7 @@ class BasePersonModelFormSet(BaseModelFormSet):
             person = person_dict.get('id')
             alive = person_dict.get('alive')
             if person and alive and person.name == "Grace Hopper":
-                raise forms.ValidationError("Grace is not a Zombie")
+                raise ValidationError("Grace is not a Zombie")
 
 
 class PersonAdmin(admin.ModelAdmin):

+ 2 - 2
tests/admin_views/custom_has_permission_admin.py

@@ -4,6 +4,7 @@ A custom AdminSite for AdminViewPermissionsTest.test_login_has_permission().
 from django.contrib import admin
 from django.contrib.auth import get_permission_codename
 from django.contrib.auth.forms import AuthenticationForm
+from django.core.exceptions import ValidationError
 
 from . import admin as base_admin, models
 
@@ -12,9 +13,8 @@ PERMISSION_NAME = 'admin_views.%s' % get_permission_codename('change', models.Ar
 
 class PermissionAdminAuthenticationForm(AuthenticationForm):
     def confirm_login_allowed(self, user):
-        from django import forms
         if not user.is_active or not (user.is_staff or user.has_perm(PERMISSION_NAME)):
-            raise forms.ValidationError('permission denied')
+            raise ValidationError('permission denied')
 
 
 class HasPermissionAdmin(admin.AdminSite):

+ 2 - 2
tests/admin_views/forms.py

@@ -1,6 +1,6 @@
-from django import forms
 from django.contrib.admin.forms import AdminAuthenticationForm
 from django.contrib.admin.helpers import ActionForm
+from django.core.exceptions import ValidationError
 
 
 class CustomAdminAuthenticationForm(AdminAuthenticationForm):
@@ -11,7 +11,7 @@ class CustomAdminAuthenticationForm(AdminAuthenticationForm):
     def clean_username(self):
         username = self.cleaned_data.get('username')
         if username == 'customform':
-            raise forms.ValidationError('custom form error')
+            raise ValidationError('custom form error')
         return username
 
 

+ 6 - 6
tests/auth_tests/test_forms.py

@@ -2,7 +2,6 @@ import datetime
 import re
 from unittest import mock
 
-from django import forms
 from django.contrib.auth.forms import (
     AdminPasswordChangeForm, AuthenticationForm, PasswordChangeForm,
     PasswordResetForm, ReadOnlyPasswordHashField, ReadOnlyPasswordHashWidget,
@@ -12,6 +11,7 @@ from django.contrib.auth.models import User
 from django.contrib.auth.signals import user_login_failed
 from django.contrib.sites.models import Site
 from django.core import mail
+from django.core.exceptions import ValidationError
 from django.core.mail import EmailMultiAlternatives
 from django.forms.fields import CharField, Field, IntegerField
 from django.test import SimpleTestCase, TestCase, override_settings
@@ -372,13 +372,13 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
         form = AuthenticationFormWithInactiveUsersOkay(None, data)
         self.assertTrue(form.is_valid())
 
-        # If we want to disallow some logins according to custom logic,
-        # we should raise a django.forms.ValidationError in the form.
+        # Raise a ValidationError in the form to disallow some logins according
+        # to custom logic.
         class PickyAuthenticationForm(AuthenticationForm):
             def confirm_login_allowed(self, user):
                 if user.username == "inactive":
-                    raise forms.ValidationError("This user is disallowed.")
-                raise forms.ValidationError("Sorry, nobody's allowed in.")
+                    raise ValidationError("This user is disallowed.")
+                raise ValidationError("Sorry, nobody's allowed in.")
 
         form = PickyAuthenticationForm(None, data)
         self.assertFalse(form.is_valid())
@@ -496,7 +496,7 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
 
     def test_get_invalid_login_error(self):
         error = AuthenticationForm().get_invalid_login_error()
-        self.assertIsInstance(error, forms.ValidationError)
+        self.assertIsInstance(error, ValidationError)
         self.assertEqual(
             error.message,
             'Please enter a correct %(username)s and password. Note that both '

+ 2 - 1
tests/forms_tests/field_tests/test_booleanfield.py

@@ -1,6 +1,7 @@
 import pickle
 
-from django.forms import BooleanField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import BooleanField
 from django.test import SimpleTestCase
 
 

+ 1 - 1
tests/forms_tests/field_tests/test_charfield.py

@@ -1,6 +1,6 @@
+from django.core.exceptions import ValidationError
 from django.forms import (
     CharField, HiddenInput, PasswordInput, Textarea, TextInput,
-    ValidationError,
 )
 from django.test import SimpleTestCase
 

+ 2 - 1
tests/forms_tests/field_tests/test_choicefield.py

@@ -1,4 +1,5 @@
-from django.forms import ChoiceField, Form, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import ChoiceField, Form
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_combofield.py

@@ -1,4 +1,5 @@
-from django.forms import CharField, ComboField, EmailField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import CharField, ComboField, EmailField
 from django.test import SimpleTestCase
 
 

+ 2 - 3
tests/forms_tests/field_tests/test_datefield.py

@@ -1,8 +1,7 @@
 from datetime import date, datetime
 
-from django.forms import (
-    DateField, Form, HiddenInput, SelectDateWidget, ValidationError,
-)
+from django.core.exceptions import ValidationError
+from django.forms import DateField, Form, HiddenInput, SelectDateWidget
 from django.test import SimpleTestCase, override_settings
 from django.utils import translation
 

+ 2 - 1
tests/forms_tests/field_tests/test_datetimefield.py

@@ -1,6 +1,7 @@
 from datetime import date, datetime
 
-from django.forms import DateTimeField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import DateTimeField
 from django.test import SimpleTestCase
 from django.utils.timezone import get_fixed_timezone, utc
 

+ 2 - 1
tests/forms_tests/field_tests/test_decimalfield.py

@@ -1,6 +1,7 @@
 import decimal
 
-from django.forms import DecimalField, NumberInput, ValidationError, Widget
+from django.core.exceptions import ValidationError
+from django.forms import DecimalField, NumberInput, Widget
 from django.test import SimpleTestCase, override_settings
 from django.utils import formats, translation
 

+ 2 - 1
tests/forms_tests/field_tests/test_emailfield.py

@@ -1,4 +1,5 @@
-from django.forms import EmailField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import EmailField
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_filefield.py

@@ -1,7 +1,8 @@
 import pickle
 
+from django.core.exceptions import ValidationError
 from django.core.files.uploadedfile import SimpleUploadedFile
-from django.forms import FileField, ValidationError
+from django.forms import FileField
 from django.test import SimpleTestCase
 
 

+ 2 - 1
tests/forms_tests/field_tests/test_filepathfield.py

@@ -1,6 +1,7 @@
 import os.path
 
-from django.forms import FilePathField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import FilePathField
 from django.test import SimpleTestCase
 
 PATH = os.path.dirname(os.path.abspath(__file__))

+ 2 - 1
tests/forms_tests/field_tests/test_floatfield.py

@@ -1,4 +1,5 @@
-from django.forms import FloatField, NumberInput, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import FloatField, NumberInput
 from django.test import SimpleTestCase
 from django.test.utils import override_settings
 from django.utils import formats, translation

+ 2 - 1
tests/forms_tests/field_tests/test_genericipaddressfield.py

@@ -1,4 +1,5 @@
-from django.forms import GenericIPAddressField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import GenericIPAddressField
 from django.test import SimpleTestCase
 
 

+ 2 - 3
tests/forms_tests/field_tests/test_imagefield.py

@@ -1,12 +1,11 @@
 import os
 import unittest
 
+from django.core.exceptions import ValidationError
 from django.core.files.uploadedfile import (
     SimpleUploadedFile, TemporaryUploadedFile,
 )
-from django.forms import (
-    ClearableFileInput, FileInput, ImageField, ValidationError, Widget,
-)
+from django.forms import ClearableFileInput, FileInput, ImageField, Widget
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_integerfield.py

@@ -1,4 +1,5 @@
-from django.forms import IntegerField, Textarea, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import IntegerField, Textarea
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_multiplechoicefield.py

@@ -1,4 +1,5 @@
-from django.forms import MultipleChoiceField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import MultipleChoiceField
 from django.test import SimpleTestCase
 
 

+ 1 - 1
tests/forms_tests/field_tests/test_multivaluefield.py

@@ -1,9 +1,9 @@
 from datetime import datetime
 
+from django.core.exceptions import ValidationError
 from django.forms import (
     CharField, Form, MultipleChoiceField, MultiValueField, MultiWidget,
     SelectMultiple, SplitDateTimeField, SplitDateTimeWidget, TextInput,
-    ValidationError,
 )
 from django.test import SimpleTestCase
 

+ 2 - 1
tests/forms_tests/field_tests/test_regexfield.py

@@ -1,6 +1,7 @@
 import re
 
-from django.forms import RegexField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import RegexField
 from django.test import SimpleTestCase
 
 

+ 2 - 1
tests/forms_tests/field_tests/test_splitdatetimefield.py

@@ -1,6 +1,7 @@
 import datetime
 
-from django.forms import SplitDateTimeField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import SplitDateTimeField
 from django.forms.widgets import SplitDateTimeWidget
 from django.test import SimpleTestCase
 

+ 2 - 1
tests/forms_tests/field_tests/test_timefield.py

@@ -1,6 +1,7 @@
 import datetime
 
-from django.forms import TimeField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import TimeField
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_typedchoicefield.py

@@ -1,6 +1,7 @@
 import decimal
 
-from django.forms import TypedChoiceField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import TypedChoiceField
 from django.test import SimpleTestCase
 
 

+ 2 - 1
tests/forms_tests/field_tests/test_typedmultiplechoicefield.py

@@ -1,6 +1,7 @@
 import decimal
 
-from django.forms import TypedMultipleChoiceField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import TypedMultipleChoiceField
 from django.test import SimpleTestCase
 
 

+ 2 - 1
tests/forms_tests/field_tests/test_urlfield.py

@@ -1,4 +1,5 @@
-from django.forms import URLField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import URLField
 from django.test import SimpleTestCase
 
 from . import FormFieldAssertionsMixin

+ 2 - 1
tests/forms_tests/field_tests/test_uuidfield.py

@@ -1,6 +1,7 @@
 import uuid
 
-from django.forms import UUIDField, ValidationError
+from django.core.exceptions import ValidationError
+from django.forms import UUIDField
 from django.test import SimpleTestCase
 
 

+ 2 - 1
tests/forms_tests/tests/test_error_messages.py

@@ -1,10 +1,11 @@
+from django.core.exceptions import ValidationError
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.forms import (
     BooleanField, CharField, ChoiceField, DateField, DateTimeField,
     DecimalField, EmailField, FileField, FloatField, Form,
     GenericIPAddressField, IntegerField, ModelChoiceField,
     ModelMultipleChoiceField, MultipleChoiceField, RegexField,
-    SplitDateTimeField, TimeField, URLField, ValidationError, utils,
+    SplitDateTimeField, TimeField, URLField, utils,
 )
 from django.template import Context, Template
 from django.test import SimpleTestCase, TestCase, ignore_warnings

+ 1 - 1
tests/forms_tests/tests/test_forms.py

@@ -3359,7 +3359,7 @@ Good luck picking a username that doesn&#x27;t already exist.</p>
 
         self.assertIsInstance(e, list)
         self.assertIn('Foo', e)
-        self.assertIn('Foo', forms.ValidationError(e))
+        self.assertIn('Foo', ValidationError(e))
 
         self.assertEqual(
             e.as_text(),

+ 2 - 1
tests/forms_tests/tests/test_formsets.py

@@ -2,9 +2,10 @@ import datetime
 from collections import Counter
 from unittest import mock
 
+from django.core.exceptions import ValidationError
 from django.forms import (
     BaseForm, CharField, DateField, FileField, Form, IntegerField,
-    SplitDateTimeField, ValidationError, formsets,
+    SplitDateTimeField, formsets,
 )
 from django.forms.formsets import BaseFormSet, all_valid, formset_factory
 from django.forms.utils import ErrorList

+ 53 - 52
tests/forms_tests/tests/test_input_formats.py

@@ -1,6 +1,7 @@
 from datetime import date, datetime, time
 
 from django import forms
+from django.core.exceptions import ValidationError
 from django.test import SimpleTestCase, override_settings
 from django.utils.translation import activate, deactivate
 
@@ -19,7 +20,7 @@ class LocalizedTimeTests(SimpleTestCase):
         "TimeFields can parse dates in the default format"
         f = forms.TimeField()
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
 
         # Parse a time in a valid format, get a parsed result
@@ -46,7 +47,7 @@ class LocalizedTimeTests(SimpleTestCase):
         "Localized TimeFields act as unlocalized widgets"
         f = forms.TimeField(localize=True)
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
 
         # Parse a time in a valid format, get a parsed result
@@ -69,9 +70,9 @@ class LocalizedTimeTests(SimpleTestCase):
         "TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"])
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -94,9 +95,9 @@ class LocalizedTimeTests(SimpleTestCase):
         "Localized TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True)
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -122,7 +123,7 @@ class CustomTimeInputFormatsTests(SimpleTestCase):
         "TimeFields can parse dates in the default format"
         f = forms.TimeField()
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -145,7 +146,7 @@ class CustomTimeInputFormatsTests(SimpleTestCase):
         "Localized TimeFields act as unlocalized widgets"
         f = forms.TimeField(localize=True)
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -168,9 +169,9 @@ class CustomTimeInputFormatsTests(SimpleTestCase):
         "TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"])
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -193,9 +194,9 @@ class CustomTimeInputFormatsTests(SimpleTestCase):
         "Localized TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True)
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -220,7 +221,7 @@ class SimpleTimeFormatTests(SimpleTestCase):
         "TimeFields can parse dates in the default format"
         f = forms.TimeField()
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
 
         # Parse a time in a valid format, get a parsed result
@@ -243,7 +244,7 @@ class SimpleTimeFormatTests(SimpleTestCase):
         "Localized TimeFields in a non-localized environment act as unlocalized widgets"
         f = forms.TimeField()
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM')
 
         # Parse a time in a valid format, get a parsed result
@@ -266,7 +267,7 @@ class SimpleTimeFormatTests(SimpleTestCase):
         "TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%I:%M:%S %p", "%I:%M %p"])
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -289,7 +290,7 @@ class SimpleTimeFormatTests(SimpleTestCase):
         "Localized TimeFields with manually specified input formats can accept those formats"
         f = forms.TimeField(input_formats=["%I:%M:%S %p", "%I:%M %p"], localize=True)
         # Parse a time in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05')
 
         # Parse a time in a valid format, get a parsed result
@@ -321,7 +322,7 @@ class LocalizedDateTests(SimpleTestCase):
         "DateFields can parse dates in the default format"
         f = forms.DateField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21/12/2010')
 
         # ISO formats are accepted, even if not specified in formats.py
@@ -347,7 +348,7 @@ class LocalizedDateTests(SimpleTestCase):
         "Localized DateFields act as unlocalized widgets"
         f = forms.DateField(localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21/12/2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -370,11 +371,11 @@ class LocalizedDateTests(SimpleTestCase):
         "DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21/12/2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -397,11 +398,11 @@ class LocalizedDateTests(SimpleTestCase):
         "Localized DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21/12/2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -427,7 +428,7 @@ class CustomDateInputFormatsTests(SimpleTestCase):
         "DateFields can parse dates in the default format"
         f = forms.DateField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -450,7 +451,7 @@ class CustomDateInputFormatsTests(SimpleTestCase):
         "Localized DateFields act as unlocalized widgets"
         f = forms.DateField(localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -473,9 +474,9 @@ class CustomDateInputFormatsTests(SimpleTestCase):
         "DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -498,9 +499,9 @@ class CustomDateInputFormatsTests(SimpleTestCase):
         "Localized DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -525,7 +526,7 @@ class SimpleDateFormatTests(SimpleTestCase):
         "DateFields can parse dates in the default format"
         f = forms.DateField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -548,7 +549,7 @@ class SimpleDateFormatTests(SimpleTestCase):
         "Localized DateFields in a non-localized environment act as unlocalized widgets"
         f = forms.DateField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -571,7 +572,7 @@ class SimpleDateFormatTests(SimpleTestCase):
         "DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%d.%m.%Y", "%d-%m-%Y"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -594,7 +595,7 @@ class SimpleDateFormatTests(SimpleTestCase):
         "Localized DateFields with manually specified input formats can accept those formats"
         f = forms.DateField(input_formats=["%d.%m.%Y", "%d-%m-%Y"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21')
 
         # Parse a date in a valid format, get a parsed result
@@ -626,7 +627,7 @@ class LocalizedDateTimeTests(SimpleTestCase):
         "DateTimeFields can parse dates in the default format"
         f = forms.DateTimeField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM 21/12/2010')
 
         # ISO formats are accepted, even if not specified in formats.py
@@ -652,7 +653,7 @@ class LocalizedDateTimeTests(SimpleTestCase):
         "Localized DateTimeFields act as unlocalized widgets"
         f = forms.DateTimeField(localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM 21/12/2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -675,11 +676,11 @@ class LocalizedDateTimeTests(SimpleTestCase):
         "DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%H.%M.%S %m.%d.%Y", "%H.%M %m-%d-%Y"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010-12-21 13:30:05 13:30:05')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM 21/12/2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -702,11 +703,11 @@ class LocalizedDateTimeTests(SimpleTestCase):
         "Localized DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%H.%M.%S %m.%d.%Y", "%H.%M %m-%d-%Y"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('1:30:05 PM 21/12/2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -736,7 +737,7 @@ class CustomDateTimeInputFormatsTests(SimpleTestCase):
         "DateTimeFields can parse dates in the default format"
         f = forms.DateTimeField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result
@@ -759,7 +760,7 @@ class CustomDateTimeInputFormatsTests(SimpleTestCase):
         "Localized DateTimeFields act as unlocalized widgets"
         f = forms.DateTimeField(localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result
@@ -782,9 +783,9 @@ class CustomDateTimeInputFormatsTests(SimpleTestCase):
         "DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%m.%d.%Y %H:%M:%S", "%m-%d-%Y %H:%M"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result
@@ -807,9 +808,9 @@ class CustomDateTimeInputFormatsTests(SimpleTestCase):
         "Localized DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%m.%d.%Y %H:%M:%S", "%m-%d-%Y %H:%M"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result
@@ -834,7 +835,7 @@ class SimpleDateTimeFormatTests(SimpleTestCase):
         "DateTimeFields can parse dates in the default format"
         f = forms.DateTimeField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -857,7 +858,7 @@ class SimpleDateTimeFormatTests(SimpleTestCase):
         "Localized DateTimeFields in a non-localized environment act as unlocalized widgets"
         f = forms.DateTimeField()
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('13:30:05 21.12.2010')
 
         # Parse a date in a valid format, get a parsed result
@@ -880,7 +881,7 @@ class SimpleDateTimeFormatTests(SimpleTestCase):
         "DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%I:%M:%S %p %d.%m.%Y", "%I:%M %p %d-%m-%Y"])
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result
@@ -903,7 +904,7 @@ class SimpleDateTimeFormatTests(SimpleTestCase):
         "Localized DateTimeFields with manually specified input formats can accept those formats"
         f = forms.DateTimeField(input_formats=["%I:%M:%S %p %d.%m.%Y", "%I:%M %p %d-%m-%Y"], localize=True)
         # Parse a date in an unaccepted format; get an error
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             f.clean('2010/12/21 13:30:05')
 
         # Parse a date in a valid format, get a parsed result

+ 4 - 4
tests/gis_tests/test_geoforms.py

@@ -3,7 +3,7 @@ import re
 from django.contrib.gis import forms
 from django.contrib.gis.forms import BaseGeometryWidget, OpenLayersWidget
 from django.contrib.gis.geos import GEOSGeometry
-from django.forms import ValidationError
+from django.core.exceptions import ValidationError
 from django.test import SimpleTestCase, override_settings
 from django.utils.html import escape
 
@@ -39,7 +39,7 @@ class GeometryFieldTest(SimpleTestCase):
         "Testing GeometryField's handling of null (None) geometries."
         # Form fields, by default, are required (`required=True`)
         fld = forms.GeometryField()
-        with self.assertRaisesMessage(forms.ValidationError, "No geometry value provided."):
+        with self.assertRaisesMessage(ValidationError, "No geometry value provided."):
             fld.clean(None)
 
         # This will clean None as a geometry (See #10660).
@@ -64,7 +64,7 @@ class GeometryFieldTest(SimpleTestCase):
             pnt_fld.to_python('LINESTRING(0 0, 1 1)')
         )
         # but rejected by `clean`
-        with self.assertRaises(forms.ValidationError):
+        with self.assertRaises(ValidationError):
             pnt_fld.clean('LINESTRING(0 0, 1 1)')
 
     def test_to_python(self):
@@ -92,7 +92,7 @@ class GeometryFieldTest(SimpleTestCase):
         # but raises a ValidationError for any other string
         for geo_input in bad_inputs:
             with self.subTest(geo_input=geo_input):
-                with self.assertRaises(forms.ValidationError):
+                with self.assertRaises(ValidationError):
                     fld.to_python(geo_input)
 
     def test_to_python_different_map_srid(self):

+ 1 - 1
tests/model_forms/test_modelchoicefield.py

@@ -1,7 +1,7 @@
 import datetime
 
 from django import forms
-from django.core.validators import ValidationError
+from django.core.exceptions import ValidationError
 from django.forms.models import ModelChoiceIterator
 from django.forms.widgets import CheckboxSelectMultiple
 from django.template import Context, Template

+ 2 - 3
tests/model_forms/tests.py

@@ -5,10 +5,9 @@ from unittest import mock, skipUnless
 
 from django import forms
 from django.core.exceptions import (
-    NON_FIELD_ERRORS, FieldError, ImproperlyConfigured,
+    NON_FIELD_ERRORS, FieldError, ImproperlyConfigured, ValidationError,
 )
 from django.core.files.uploadedfile import SimpleUploadedFile
-from django.core.validators import ValidationError
 from django.db import connection, models
 from django.db.models.query import EmptyQuerySet
 from django.forms.models import (
@@ -2619,7 +2618,7 @@ class CustomCleanTests(TestCase):
 
             def clean(self):
                 if not self.cleaned_data['left'] == self.cleaned_data['right']:
-                    raise forms.ValidationError('Left and right should be equal')
+                    raise ValidationError('Left and right should be equal')
                 return self.cleaned_data
 
         form = TripleFormWithCleanOverride({'left': 1, 'middle': 2, 'right': 1})

+ 2 - 1
tests/test_client/views.py

@@ -4,8 +4,9 @@ from xml.dom.minidom import parseString
 
 from django.contrib.auth.decorators import login_required, permission_required
 from django.core import mail
+from django.core.exceptions import ValidationError
 from django.forms import fields
-from django.forms.forms import Form, ValidationError
+from django.forms.forms import Form
 from django.forms.formsets import BaseFormSet, formset_factory
 from django.http import (
     HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed,