diff --git a/django/forms/models.py b/django/forms/models.py
index 3648a45..0324ce9 100644
|
a
|
b
|
class BaseInlineFormSet(BaseModelFormSet):
|
| 749 | 749 | # The foreign key field might not be on the form, so we poke at the |
| 750 | 750 | # Model field to get the label, since we need that for error messages. |
| 751 | 751 | form.fields[self.fk.name] = InlineForeignKeyField(self.instance, |
| | 752 | to_field=self.fk.rel.field_name, |
| 752 | 753 | label=getattr(form.fields.get(self.fk.name), 'label', capfirst(self.fk.verbose_name)) |
| 753 | 754 | ) |
| 754 | 755 | |
| … |
… |
class InlineForeignKeyField(Field):
|
| 840 | 841 | def __init__(self, parent_instance, *args, **kwargs): |
| 841 | 842 | self.parent_instance = parent_instance |
| 842 | 843 | self.pk_field = kwargs.pop("pk_field", False) |
| | 844 | self.to_field = kwargs.pop('to_field', None) |
| 843 | 845 | if self.parent_instance is not None: |
| 844 | | kwargs["initial"] = self.parent_instance.pk |
| | 846 | if self.to_field: |
| | 847 | kwargs["initial"] = getattr(self.parent_instance, self.to_field) |
| | 848 | else: |
| | 849 | kwargs["initial"] = self.parent_instance.pk |
| 845 | 850 | kwargs["required"] = False |
| 846 | 851 | kwargs["widget"] = InlineForeignKeyHiddenInput |
| 847 | 852 | super(InlineForeignKeyField, self).__init__(*args, **kwargs) |
| … |
… |
class InlineForeignKeyField(Field):
|
| 853 | 858 | # if there is no value act as we did before. |
| 854 | 859 | return self.parent_instance |
| 855 | 860 | # ensure the we compare the values as equal types. |
| 856 | | if force_unicode(value) != force_unicode(self.parent_instance.pk): |
| | 861 | orig = self.parent_instance.pk |
| | 862 | if self.to_field: |
| | 863 | orig = getattr(self.parent_instance, self.to_field) |
| | 864 | if force_unicode(value) != force_unicode(orig): |
| 857 | 865 | raise ValidationError(self.error_messages['invalid_choice']) |
| 858 | 866 | return self.parent_instance |
| 859 | 867 | |
diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py
index 488e2bc..00e756b 100644
|
a
|
b
|
class Article(models.Model):
|
| 28 | 28 | |
| 29 | 29 | def __unicode__(self): |
| 30 | 30 | return self.headline |
| | 31 | |
| | 32 | class User(models.Model): |
| | 33 | serial = models.IntegerField(primary_key=True) |
| | 34 | username = models.CharField(max_length=12, unique=True) |
| | 35 | |
| | 36 | class UserSite(models.Model): |
| | 37 | user = models.ForeignKey(User, to_field="username") |
| | 38 | data = models.IntegerField() |
diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py
index ccc272e..bef053d 100644
|
a
|
b
|
from datetime import date
|
| 2 | 2 | |
| 3 | 3 | from django import db |
| 4 | 4 | from django import forms |
| 5 | | from django.forms.models import modelform_factory |
| | 5 | from django.forms.models import modelform_factory, inlineformset_factory |
| 6 | 6 | from django.conf import settings |
| 7 | 7 | from django.test import TestCase |
| 8 | 8 | |
| 9 | | from models import Person, Triple, FilePathModel, Article, Publication |
| | 9 | from models import Person, Triple, FilePathModel, Article, Publication, User, UserSite |
| 10 | 10 | |
| 11 | 11 | class ModelMultipleChoiceFieldTests(TestCase): |
| 12 | 12 | |
| … |
… |
class ManyToManyCallableInitialTests(TestCase):
|
| 88 | 88 | <option value="2" selected="selected">Second Book</option> |
| 89 | 89 | <option value="3">Third Book</option> |
| 90 | 90 | </select> Hold down "Control", or "Command" on a Mac, to select more than one.</li>""") |
| | 91 | |
| | 92 | class ToFieldTest(TestCase): |
| | 93 | # regression test for #10243 |
| | 94 | def test_inline_formste(self): |
| | 95 | form_set = inlineformset_factory(User, UserSite) |
| | 96 | user = User.objects.create(serial=1, username='apollo13') |
| | 97 | user.save() |
| | 98 | data = {'usersite_set-TOTAL_FORMS': u'1', |
| | 99 | 'usersite_set-INITIAL_FORMS': u'0', |
| | 100 | 'usersite_set-0-data': u'10', |
| | 101 | 'usersite_set-0-user': u'apollo13'} |
| | 102 | f_instance = form_set(data, instance=user) |
| | 103 | f_instance.forms[0].is_valid() |
| | 104 | f_instance.save() |
| | 105 | usersite = UserSite.objects.all().values()[0] |
| | 106 | assert usersite == {'data': 10, 'user_id': u'apollo13', 'id': 1} |
| | 107 | user.delete() |