Selaa lähdekoodia

Fixed #18898 -- Added tests with a fix for ModelMultipleChoiceField

Claude Paroz 12 vuotta sitten
vanhempi
commit
3318595c0b
2 muutettua tiedostoa jossa 33 lisäystä ja 1 poistoa
  1. 1 1
      django/forms/models.py
  2. 32 0
      tests/model_formsets/tests.py

+ 1 - 1
django/forms/models.py

@@ -1072,6 +1072,6 @@ class ModelMultipleChoiceField(ModelChoiceField):
             data = []
         if len(initial) != len(data):
             return True
-        initial_set = set([force_text(value) for value in initial])
+        initial_set = set([force_text(value) for value in self.prepare_value(initial)])
         data_set = set([force_text(value) for value in data])
         return data_set != initial_set

+ 32 - 0
tests/model_formsets/tests.py

@@ -1071,6 +1071,38 @@ class ModelFormsetTest(TestCase):
         FormSet = modelformset_factory(ClassyMexicanRestaurant, fields=["tacos_are_yummy"])
         self.assertEqual(sorted(FormSet().forms[0].fields.keys()), ['restaurant', 'tacos_are_yummy'])
 
+    def test_model_formset_with_initial_model_instance(self):
+        # has_changed should compare model instance and primary key
+        # see #18898
+        FormSet = modelformset_factory(Poem)
+        john_milton = Poet(name="John Milton")
+        john_milton.save()
+        data = {
+            'form-TOTAL_FORMS': 1,
+            'form-INITIAL_FORMS': 0,
+            'form-MAX_NUM_FORMS': '',
+            'form-0-name': '',
+            'form-0-poet': str(john_milton.id),
+        }
+        formset = FormSet(initial=[{'poet': john_milton}], data=data)
+        self.assertFalse(formset.extra_forms[0].has_changed())
+
+    def test_model_formset_with_initial_queryset(self):
+        # has_changed should work with queryset and list of pk's
+        # see #18898
+        FormSet = modelformset_factory(AuthorMeeting)
+        author = Author.objects.create(pk=1, name='Charles Baudelaire')
+        data = {
+            'form-TOTAL_FORMS': 1,
+            'form-INITIAL_FORMS': 0,
+            'form-MAX_NUM_FORMS': '',
+            'form-0-name': '',
+            'form-0-created': '',
+            'form-0-authors': list(Author.objects.values_list('id', flat=True)),
+        }
+        formset = FormSet(initial=[{'authors': Author.objects.all()}], data=data)
+        self.assertFalse(formset.extra_forms[0].has_changed())
+
     def test_prevent_duplicates_from_with_the_same_formset(self):
         FormSet = modelformset_factory(Product, extra=2)
         data = {