#28405: CICharField on a ModelFormSet doesn't catch unique constraint violations
with different capitalization
--------------------------------------------+------------------------
               Reporter:  Jon Dufresne      |          Owner:  (none)
                   Type:  Bug               |         Status:  new
              Component:  contrib.postgres  |        Version:  1.11
               Severity:  Normal            |       Keywords:
           Triage Stage:  Unreviewed        |      Has patch:  0
    Needs documentation:  0                 |    Needs tests:  0
Patch needs improvement:  0                 |  Easy pickings:  0
                  UI/UX:  0                 |
--------------------------------------------+------------------------
 When `CICharField` (new in 1.11) with `unique=True` is used on a
 `ModelFormSet`, values differing only by case are not reported as a
 validation error. As the form appears to be valid, saving the form will
 result in a database `IntegrityError`.

 Will attach example test.


 For example:

 {{{
 class MyModel(models.Model):
     name = CICharField(max_length=100, unique=True)

 MyModelFormset = modelformset_factory(MyModel, fields=['name'])

 data = {
     'form-TOTAL_FORMS': 2,
     'form-INITIAL_FORMS': 0,
     'form-0-name': 'frank',
     'form-1-name': 'FRANK',
 }
 formset = MyModelFormSet(data)
 }}}

 Trying to save the formset, which reports no validation errors, results in
 an exception:

 {{{
 Traceback (most recent call last):
   File "/home/jon/devel/django/tests/postgres_tests/test_citext.py", line
 59, in test_duplicate_formset_mixed_case
     formset.save()
   File "/home/jon/devel/django/django/forms/models.py", line 671, in save
     return self.save_existing_objects(commit) +
 self.save_new_objects(commit)
   File "/home/jon/devel/django/django/forms/models.py", line 806, in
 save_new_objects
     self.new_objects.append(self.save_new(form, commit=commit))
   File "/home/jon/devel/django/django/forms/models.py", line 647, in
 save_new
     return form.save(commit=commit)
   File "/home/jon/devel/django/django/forms/models.py", line 457, in save
     self.instance.save()
   File "/home/jon/devel/django/django/db/models/base.py", line 711, in
 save
     force_update=force_update, update_fields=update_fields)
   File "/home/jon/devel/django/django/db/models/base.py", line 741, in
 save_base
     updated = self._save_table(raw, cls, force_insert, force_update,
 using, update_fields)
   File "/home/jon/devel/django/django/db/models/base.py", line 825, in
 _save_table
     result = self._do_insert(cls._base_manager, using, fields, update_pk,
 raw)
   File "/home/jon/devel/django/django/db/models/base.py", line 863, in
 _do_insert
     using=using, raw=raw)
   File "/home/jon/devel/django/django/db/models/manager.py", line 82, in
 manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "/home/jon/devel/django/django/db/models/query.py", line 1047, in
 _insert
     return query.get_compiler(using=using).execute_sql(return_id)
   File "/home/jon/devel/django/django/db/models/sql/compiler.py", line
 1202, in execute_sql
     cursor.execute(sql, params)
   File "/home/jon/devel/django/django/db/backends/utils.py", line 62, in
 execute
     return self.cursor.execute(sql, params)
   File "/home/jon/devel/django/django/db/utils.py", line 89, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "/home/jon/devel/django/django/db/backends/utils.py", line 62, in
 execute
     return self.cursor.execute(sql, params)
 django.db.utils.IntegrityError: duplicate key value violates unique
 constraint "postgres_tests_citestmodel2_name_key"
 DETAIL:  Key (name)=(FRANK) already exists.
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28405>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.f5ab719a4f2065c22f5dc39543c050ac%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to