1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +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, SelectMultiple,
) )
from django.utils.choices import BaseChoiceIterator 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.text import capfirst, get_text_list
from django.utils.translation import gettext from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -834,8 +835,8 @@ class BaseModelFormSet(BaseFormSet, AltersData):
( (
d._get_pk_val() d._get_pk_val()
if hasattr(d, "_get_pk_val") if hasattr(d, "_get_pk_val")
# Prevent "unhashable type: list" errors later on. # Prevent "unhashable type" errors later on.
else tuple(d) if isinstance(d, list) else d else make_hashable(d)
) )
for d in row_data for d in row_data
) )

View File

@ -1703,6 +1703,30 @@ class ModelFormsetTest(TestCase):
[{}, {"__all__": ["Please correct the duplicate values below."]}, {}], [{}, {"__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): def test_model_formset_with_custom_pk(self):
# a formset for a Model that has a custom primary key that still needs to be # a formset for a Model that has a custom primary key that still needs to be
# added to the formset automatically # added to the formset automatically