summaryrefslogtreecommitdiff
path: root/tests/forms_tests
diff options
context:
space:
mode:
authorStephen Burrows <stephen.r.burrows@gmail.com>2012-09-27 19:04:40 -0700
committerTim Graham <timograham@gmail.com>2013-06-06 10:01:48 -0400
commite2518fdf46a687454066b8a75263c9019b1e965d (patch)
tree66cc802691467b4450b13e6e85691751e8abe7ef /tests/forms_tests
parentb67f2ac8e6f8cdef237590ffb2c85fc30454ba75 (diff)
Fixed #12337 - Honor ModelForm.Meta.exclude when saving ManyToManyFields.
Thanks margieroginski for the report.
Diffstat (limited to 'tests/forms_tests')
-rw-r--r--tests/forms_tests/tests/tests.py38
1 files changed, 37 insertions, 1 deletions
diff --git a/tests/forms_tests/tests/tests.py b/tests/forms_tests/tests/tests.py
index 847cd6ebdb..2616ddaf7d 100644
--- a/tests/forms_tests/tests/tests.py
+++ b/tests/forms_tests/tests/tests.py
@@ -5,7 +5,7 @@ import datetime
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import models
-from django.forms import Form, ModelForm, FileField, ModelChoiceField
+from django.forms import Form, ModelForm, FileField, ModelChoiceField, CharField
from django.forms.models import ModelFormMetaclass
from django.test import TestCase
from django.utils import six
@@ -26,6 +26,14 @@ class OptionalMultiChoiceModelForm(ModelForm):
fields = '__all__'
+class ChoiceFieldExclusionForm(ModelForm):
+ multi_choice = CharField(max_length=50)
+
+ class Meta:
+ exclude = ['multi_choice']
+ model = ChoiceFieldModel
+
+
class FileForm(Form):
file1 = FileField()
@@ -221,3 +229,31 @@ class RelatedModelFormTests(TestCase):
model=A
self.assertTrue(issubclass(ModelFormMetaclass(str('Form'), (ModelForm,), {'Meta': Meta}), ModelForm))
+
+
+class ManyToManyExclusionTestCase(TestCase):
+ def test_m2m_field_exclusion(self):
+ # Issue 12337. save_instance should honor the passed-in exclude keyword.
+ opt1 = ChoiceOptionModel.objects.create(id=1, name='default')
+ opt2 = ChoiceOptionModel.objects.create(id=2, name='option 2')
+ opt3 = ChoiceOptionModel.objects.create(id=3, name='option 3')
+ initial = {
+ 'choice': opt1,
+ 'choice_int': opt1,
+ }
+ data = {
+ 'choice': opt2.pk,
+ 'choice_int': opt2.pk,
+ 'multi_choice': 'string data!',
+ 'multi_choice_int': [opt1.pk],
+ }
+ instance = ChoiceFieldModel.objects.create(**initial)
+ instance.multi_choice = instance.multi_choice_int = [opt2, opt3]
+ form = ChoiceFieldExclusionForm(data=data, instance=instance)
+ self.assertTrue(form.is_valid())
+ self.assertEqual(form.cleaned_data['multi_choice'], data['multi_choice'])
+ form.save()
+ self.assertEqual(form.instance.choice.pk, data['choice'])
+ self.assertEqual(form.instance.choice_int.pk, data['choice_int'])
+ self.assertEqual(list(form.instance.multi_choice.all()), [opt2, opt3])
+ self.assertEqual([obj.pk for obj in form.instance.multi_choice_int.all()], data['multi_choice_int'])