1
0
mirror of https://github.com/django/django.git synced 2024-12-22 00:55:44 +00:00

Fixed #35488 -- Fixed BaseModelFormSet.validate_unique() crash due to unhashable type.

This commit is contained in:
Madalin Popa 2024-06-08 14:57:27 +02:00 committed by Sarah Boyce
parent 2a32b23382
commit d28626ecf8
2 changed files with 27 additions and 2 deletions

View File

@ -23,6 +23,7 @@ from django.forms.widgets import (
SelectMultiple,
)
from django.utils.choices import BaseChoiceIterator
from django.utils.hashable import make_hashable
from django.utils.text import capfirst, get_text_list
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _
@ -834,8 +835,8 @@ class BaseModelFormSet(BaseFormSet, AltersData):
(
d._get_pk_val()
if hasattr(d, "_get_pk_val")
# Prevent "unhashable type: list" errors later on.
else tuple(d) if isinstance(d, list) else d
# Prevent "unhashable type" errors later on.
else make_hashable(d)
)
for d in row_data
)

View File

@ -1703,6 +1703,30 @@ class ModelFormsetTest(TestCase):
[{}, {"__all__": ["Please correct the duplicate values below."]}, {}],
)
def test_inlineformset_with_jsonfield(self):
class BookForm(forms.ModelForm):
title = forms.JSONField()
class Meta:
model = Book
fields = ("title",)
BookFormSet = inlineformset_factory(Author, Book, form=BookForm)
data = {
"book_set-TOTAL_FORMS": "3",
"book_set-INITIAL_FORMS": "0",
"book_set-MAX_NUM_FORMS": "",
"book_set-0-title": {"test1": "test2"},
"book_set-1-title": {"test1": "test2"},
"book_set-2-title": {"test3": "test4"},
}
author = Author.objects.create(name="test")
formset = BookFormSet(data, instance=author)
self.assertEqual(
formset.errors,
[{}, {"__all__": ["Please correct the duplicate values below."]}, {}],
)
def test_model_formset_with_custom_pk(self):
# a formset for a Model that has a custom primary key that still needs to be
# added to the formset automatically