Ticket #13794: to_field_formsets.3.diff​

File to_field_formsets.3.diff​, 1.8 KB (added by anonymous, 5 years ago)
Line 
1diff --git a/django/forms/models.py b/django/forms/models.py
2index 9e6cab8..84da2f7 100644
3--- a/django/forms/models.py
4+++ b/django/forms/models.py
5@@ -876,7 +876,11 @@ class BaseInlineFormSet(BaseModelFormSet):
6             form.data[form.add_prefix(self.fk.name)] = None
7
8         # Set the fk value here so that the form can do its validation.
9-        setattr(form.instance, self.fk.get_attname(), self.instance.pk)
10+        fk_value = self.instance.pk
11+        if self.fk.rel.field_name != self.fk.rel.to._meta.pk.name:
12+            fk_value = getattr(self.instance, self.fk.rel.field_name)
13+            fk_value = getattr(fk_value, 'pk', fk_value)
14+        setattr(form.instance, self.fk.get_attname(), fk_value)
15         return form
16
17     @classmethod
18diff --git a/tests/model_formsets_regress/tests.py b/tests/model_formsets_regress/tests.py
19index 7d400d2..a010b9f 100644
20--- a/tests/model_formsets_regress/tests.py
21+++ b/tests/model_formsets_regress/tests.py
22@@ -154,6 +154,18 @@ class InlineFormsetTests(TestCase):
23         else:
24             self.fail('Errors found on formset:%s' % form_set.errors)
25
26+    def test_inline_model_with_to_field(self):
27+        "An inline model with a to_field of a formset with instance have working relations. Regression for #13794"
28+        FormSet = inlineformset_factory(User, UserSite, exclude=('is_superuser',))
29+
30+        user = User.objects.create(username="guido", serial=1337)
31+        UserSite.objects.create(user=user, data=10)
32+        formset = FormSet(instance=user)
33+
34+        formset[0]
35+        # Testing the inline model's relation
36+        self.assertEqual(formset[0].instance.user_id, "guido")
37+
38     def test_formset_with_none_instance(self):
39         "A formset with instance=None can be created. Regression for #11872"
40         Form = modelform_factory(User, fields="__all__")
41--
421.7.9.5
Back to Top