#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.