diff options
Diffstat (limited to 'tests/model_forms/tests.py')
| -rw-r--r-- | tests/model_forms/tests.py | 384 |
1 files changed, 240 insertions, 144 deletions
diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 096c3aae63..a615d4516d 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -251,7 +251,8 @@ class ModelFormBaseTest(TestCase): def test_empty_fields_to_construct_instance(self): """ - No fields should be set on a model instance if construct_instance receives fields=(). + No fields should be set on a model instance if construct_instance + receives fields=(). """ form = modelform_factory(Person, fields="__all__")({"name": "John Doe"}) self.assertTrue(form.is_valid()) @@ -498,8 +499,11 @@ class ModelFormBaseTest(TestCase): fields = ["nonexistent"] def test_limit_fields_with_string(self): - expected_msg = "CategoryForm.Meta.fields cannot be a string. Did you mean to type: ('url',)?" - with self.assertRaisesMessage(TypeError, expected_msg): + msg = ( + "CategoryForm.Meta.fields cannot be a string. Did you mean to type: " + "('url',)?" + ) + with self.assertRaisesMessage(TypeError, msg): class CategoryForm(forms.ModelForm): class Meta: @@ -523,8 +527,11 @@ class ModelFormBaseTest(TestCase): self.assertEqual(list(ExcludeFields.base_fields), ["name", "slug", "url"]) def test_exclude_fields_with_string(self): - expected_msg = "CategoryForm.Meta.exclude cannot be a string. Did you mean to type: ('url',)?" - with self.assertRaisesMessage(TypeError, expected_msg): + msg = ( + "CategoryForm.Meta.exclude cannot be a string. Did you mean to type: " + "('url',)?" + ) + with self.assertRaisesMessage(TypeError, msg): class CategoryForm(forms.ModelForm): class Meta: @@ -923,11 +930,13 @@ class TestFieldOverridesByFormMeta(SimpleTestCase): form = FieldOverridesByFormMetaForm() self.assertHTMLEqual( str(form["name"]), - '<textarea id="id_name" rows="10" cols="40" name="name" maxlength="20" required></textarea>', + '<textarea id="id_name" rows="10" cols="40" name="name" maxlength="20" ' + "required></textarea>", ) self.assertHTMLEqual( str(form["url"]), - '<input id="id_url" type="text" class="url" name="url" maxlength="40" required>', + '<input id="id_url" type="text" class="url" name="url" maxlength="40" ' + "required>", ) self.assertHTMLEqual( str(form["slug"]), @@ -1380,7 +1389,9 @@ class UniqueTest(TestCase): class Meta(PriceForm.Meta): error_messages = { NON_FIELD_ERRORS: { - "unique_together": "%(model_name)s's %(field_labels)s not unique.", + "unique_together": ( + "%(model_name)s's %(field_labels)s not unique." + ), } } @@ -1446,9 +1457,14 @@ class ModelFormBasicTests(TestCase): ) self.assertHTMLEqual( str(f.as_ul()), - """<li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="20" required></li> -<li><label for="id_slug">Slug:</label> <input id="id_slug" type="text" name="slug" maxlength="20" required></li> -<li><label for="id_url">The URL:</label> <input id="id_url" type="text" name="url" maxlength="40" required></li>""", + """ + <li><label for="id_name">Name:</label> + <input id="id_name" type="text" name="name" maxlength="20" required></li> + <li><label for="id_slug">Slug:</label> + <input id="id_slug" type="text" name="slug" maxlength="20" required></li> + <li><label for="id_url">The URL:</label> + <input id="id_url" type="text" name="url" maxlength="40" required></li> + """, ) self.assertHTMLEqual( str(f["name"]), @@ -1476,26 +1492,32 @@ class ModelFormBasicTests(TestCase): ) self.assertHTMLEqual( f.as_ul(), - """<li>Headline: <input type="text" name="headline" value="Your headline here" maxlength="50" required></li> -<li>Slug: <input type="text" name="slug" maxlength="50" required></li> -<li>Pub date: <input type="text" name="pub_date" required></li> -<li>Writer: <select name="writer" required> -<option value="" selected>---------</option> -<option value="%s">Bob Woodward</option> -<option value="%s">Mike Royko</option> -</select></li> -<li>Article: <textarea rows="10" cols="40" name="article" required></textarea></li> -<li>Categories: <select multiple name="categories"> -<option value="%s" selected>Entertainment</option> -<option value="%s" selected>It's a test</option> -<option value="%s">Third test</option> -</select></li> -<li>Status: <select name="status"> -<option value="" selected>---------</option> -<option value="1">Draft</option> -<option value="2">Pending</option> -<option value="3">Live</option> -</select></li>""" + """ + <li>Headline: + <input type="text" name="headline" value="Your headline here" maxlength="50" + required> + </li> + <li>Slug: <input type="text" name="slug" maxlength="50" required></li> + <li>Pub date: <input type="text" name="pub_date" required></li> + <li>Writer: <select name="writer" required> + <option value="" selected>---------</option> + <option value="%s">Bob Woodward</option> + <option value="%s">Mike Royko</option> + </select></li> + <li>Article: + <textarea rows="10" cols="40" name="article" required></textarea></li> + <li>Categories: <select multiple name="categories"> + <option value="%s" selected>Entertainment</option> + <option value="%s" selected>It's a test</option> + <option value="%s">Third test</option> + </select></li> + <li>Status: <select name="status"> + <option value="" selected>---------</option> + <option value="1">Draft</option> + <option value="2">Pending</option> + <option value="3">Live</option> + </select></li> + """ % (self.w_woodward.pk, self.w_royko.pk, self.c1.pk, self.c2.pk, self.c3.pk), ) @@ -1504,8 +1526,12 @@ class ModelFormBasicTests(TestCase): f = RoykoForm(auto_id=False, instance=self.w_royko) self.assertHTMLEqual( str(f), - """<tr><th>Name:</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" required><br> - <span class="helptext">Use both first and last names.</span></td></tr>""", + """ + <tr><th>Name:</th><td> + <input type="text" name="name" value="Mike Royko" maxlength="50" required> + <br> + <span class="helptext">Use both first and last names.</span></td></tr> + """, ) art = Article.objects.create( @@ -1520,26 +1546,35 @@ class ModelFormBasicTests(TestCase): f = ArticleForm(auto_id=False, instance=art) self.assertHTMLEqual( f.as_ul(), - """<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" required></li> -<li>Slug: <input type="text" name="slug" value="test-article" maxlength="50" required></li> -<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" required></li> -<li>Writer: <select name="writer" required> -<option value="">---------</option> -<option value="%s">Bob Woodward</option> -<option value="%s" selected>Mike Royko</option> -</select></li> -<li>Article: <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> -<li>Categories: <select multiple name="categories"> -<option value="%s">Entertainment</option> -<option value="%s">It's a test</option> -<option value="%s">Third test</option> -</select></li> -<li>Status: <select name="status"> -<option value="" selected>---------</option> -<option value="1">Draft</option> -<option value="2">Pending</option> -<option value="3">Live</option> -</select></li>""" + """ + <li>Headline: + <input type="text" name="headline" value="Test article" maxlength="50" + required> + </li> + <li>Slug: + <input type="text" name="slug" value="test-article" maxlength="50" required> + </li> + <li>Pub date: + <input type="text" name="pub_date" value="1988-01-04" required></li> + <li>Writer: <select name="writer" required> + <option value="">---------</option> + <option value="%s">Bob Woodward</option> + <option value="%s" selected>Mike Royko</option> + </select></li> + <li>Article: + <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> + <li>Categories: <select multiple name="categories"> + <option value="%s">Entertainment</option> + <option value="%s">It's a test</option> + <option value="%s">Third test</option> + </select></li> + <li>Status: <select name="status"> + <option value="" selected>---------</option> + <option value="1">Draft</option> + <option value="2">Pending</option> + <option value="3">Live</option> + </select></li> + """ % (self.w_woodward.pk, self.w_royko.pk, self.c1.pk, self.c2.pk, self.c3.pk), ) @@ -1562,7 +1597,7 @@ class ModelFormBasicTests(TestCase): def test_m2m_initial_callable(self): """ - Regression for #10349: A callable can be provided as the initial value for an m2m field + A callable can be provided as the initial value for an m2m field. """ self.maxDiff = 1200 self.create_basic_data() @@ -1635,7 +1670,8 @@ class ModelFormBasicTests(TestCase): self.assertEqual( f.errors["slug"], [ - "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." + "Enter a valid “slug” consisting of letters, numbers, underscores or " + "hyphens." ], ) self.assertEqual(f.cleaned_data, {"url": "foo"}) @@ -1654,26 +1690,32 @@ class ModelFormBasicTests(TestCase): f = ArticleForm(auto_id=False) self.assertHTMLEqual( str(f), - """<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" required></td></tr> -<tr><th>Slug:</th><td><input type="text" name="slug" maxlength="50" required></td></tr> -<tr><th>Pub date:</th><td><input type="text" name="pub_date" required></td></tr> -<tr><th>Writer:</th><td><select name="writer" required> -<option value="" selected>---------</option> -<option value="%s">Bob Woodward</option> -<option value="%s">Mike Royko</option> -</select></td></tr> -<tr><th>Article:</th><td><textarea rows="10" cols="40" name="article" required></textarea></td></tr> -<tr><th>Categories:</th><td><select multiple name="categories"> -<option value="%s">Entertainment</option> -<option value="%s">It's a test</option> -<option value="%s">Third test</option> -</select></td></tr> -<tr><th>Status:</th><td><select name="status"> -<option value="" selected>---------</option> -<option value="1">Draft</option> -<option value="2">Pending</option> -<option value="3">Live</option> -</select></td></tr>""" + """ + <tr><th>Headline:</th><td> + <input type="text" name="headline" maxlength="50" required></td></tr> + <tr><th>Slug:</th><td> + <input type="text" name="slug" maxlength="50" required></td></tr> + <tr><th>Pub date:</th><td> + <input type="text" name="pub_date" required></td></tr> + <tr><th>Writer:</th><td><select name="writer" required> + <option value="" selected>---------</option> + <option value="%s">Bob Woodward</option> + <option value="%s">Mike Royko</option> + </select></td></tr> + <tr><th>Article:</th><td> + <textarea rows="10" cols="40" name="article" required></textarea></td></tr> + <tr><th>Categories:</th><td><select multiple name="categories"> + <option value="%s">Entertainment</option> + <option value="%s">It's a test</option> + <option value="%s">Third test</option> + </select></td></tr> + <tr><th>Status:</th><td><select name="status"> + <option value="" selected>---------</option> + <option value="1">Draft</option> + <option value="2">Pending</option> + <option value="3">Live</option> + </select></td></tr> + """ % (self.w_woodward.pk, self.w_royko.pk, self.c1.pk, self.c2.pk, self.c3.pk), ) @@ -1690,26 +1732,35 @@ class ModelFormBasicTests(TestCase): f = ArticleForm(auto_id=False, instance=new_art) self.assertHTMLEqual( f.as_ul(), - """<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" required></li> -<li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" required></li> -<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" required></li> -<li>Writer: <select name="writer" required> -<option value="">---------</option> -<option value="%s">Bob Woodward</option> -<option value="%s" selected>Mike Royko</option> -</select></li> -<li>Article: <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> -<li>Categories: <select multiple name="categories"> -<option value="%s" selected>Entertainment</option> -<option value="%s">It's a test</option> -<option value="%s">Third test</option> -</select></li> -<li>Status: <select name="status"> -<option value="" selected>---------</option> -<option value="1">Draft</option> -<option value="2">Pending</option> -<option value="3">Live</option> -</select></li>""" + """ + <li>Headline: + <input type="text" name="headline" value="New headline" maxlength="50" + required> + </li> + <li>Slug: + <input type="text" name="slug" value="new-headline" maxlength="50" required> + </li> + <li>Pub date: + <input type="text" name="pub_date" value="1988-01-04" required></li> + <li>Writer: <select name="writer" required> + <option value="">---------</option> + <option value="%s">Bob Woodward</option> + <option value="%s" selected>Mike Royko</option> + </select></li> + <li>Article: + <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> + <li>Categories: <select multiple name="categories"> + <option value="%s" selected>Entertainment</option> + <option value="%s">It's a test</option> + <option value="%s">Third test</option> + </select></li> + <li>Status: <select name="status"> + <option value="" selected>---------</option> + <option value="1">Draft</option> + <option value="2">Pending</option> + <option value="3">Live</option> + </select></li> + """ % (self.w_woodward.pk, self.w_royko.pk, self.c1.pk, self.c2.pk, self.c3.pk), ) @@ -1728,8 +1779,12 @@ class ModelFormBasicTests(TestCase): f = PartialArticleForm(auto_id=False) self.assertHTMLEqual( str(f), - """<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" required></td></tr> -<tr><th>Pub date:</th><td><input type="text" name="pub_date" required></td></tr>""", + """ + <tr><th>Headline:</th><td> + <input type="text" name="headline" maxlength="50" required></td></tr> + <tr><th>Pub date:</th><td> + <input type="text" name="pub_date" required></td></tr> + """, ) class PartialArticleFormWithSlug(forms.ModelForm): @@ -1756,9 +1811,18 @@ class ModelFormBasicTests(TestCase): ) self.assertHTMLEqual( f.as_ul(), - """<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" required></li> -<li>Slug: <input type="text" name="slug" value="new-headline" maxlength="50" required></li> -<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" required></li>""", + """ + <li>Headline: + <input type="text" name="headline" value="New headline" maxlength="50" + required> + </li> + <li>Slug: + <input type="text" name="slug" value="new-headline" maxlength="50" + required> + </li> + <li>Pub date: + <input type="text" name="pub_date" value="1988-01-04" required></li> + """, ) self.assertTrue(f.is_valid()) new_art = f.save() @@ -1785,7 +1849,8 @@ class ModelFormBasicTests(TestCase): new_art.categories.order_by("name"), [self.c1, self.c2] ) - # Now, submit form data with no categories. This deletes the existing categories. + # Now, submit form data with no categories. This deletes the existing + # categories. form_data["categories"] = [] f = ArticleForm(form_data, instance=new_art) new_art = f.save() @@ -1823,9 +1888,9 @@ class ModelFormBasicTests(TestCase): ) def test_custom_form_fields(self): - # Here, we define a custom ModelForm. Because it happens to have the same fields as - # the Category model, we can just call the form's save() to apply its changes to an - # existing Category instance. + # Here, we define a custom ModelForm. Because it happens to have the + # same fields as the Category model, we can just call the form's save() + # to apply its changes to an existing Category instance. class ShortCategory(forms.ModelForm): name = forms.CharField(max_length=5) slug = forms.CharField(max_length=5) @@ -1949,7 +2014,8 @@ class ModelFormBasicTests(TestCase): form.errors, { "writer": [ - "Select a valid choice. That choice is not one of the available choices." + "Select a valid choice. That choice is not one of the available " + "choices." ] }, ) @@ -2222,7 +2288,8 @@ class ModelOneToOneFieldTests(TestCase): def test_modelform_subclassed_model(self): class BetterWriterForm(forms.ModelForm): class Meta: - # BetterWriter model is a subclass of Writer with an additional `score` field + # BetterWriter model is a subclass of Writer with an additional + # `score` field. model = BetterWriter fields = "__all__" @@ -2259,12 +2326,16 @@ class ModelOneToOneFieldTests(TestCase): form = WriterProfileForm() self.assertHTMLEqual( form.as_p(), - """<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer" required> -<option value="" selected>---------</option> -<option value="%s">Bob Woodward</option> -<option value="%s">Mike Royko</option> -</select></p> -<p><label for="id_age">Age:</label> <input type="number" name="age" id="id_age" min="0" required></p>""" + """ + <p><label for="id_writer">Writer:</label> + <select name="writer" id="id_writer" required> + <option value="" selected>---------</option> + <option value="%s">Bob Woodward</option> + <option value="%s">Mike Royko</option> + </select></p> + <p><label for="id_age">Age:</label> + <input type="number" name="age" id="id_age" min="0" required></p> + """ % ( self.w_woodward.pk, self.w_royko.pk, @@ -2282,13 +2353,16 @@ class ModelOneToOneFieldTests(TestCase): form = WriterProfileForm(instance=instance) self.assertHTMLEqual( form.as_p(), - """<p><label for="id_writer">Writer:</label> <select name="writer" id="id_writer" required> -<option value="">---------</option> -<option value="%s" selected>Bob Woodward</option> -<option value="%s">Mike Royko</option> -</select></p> -<p><label for="id_age">Age:</label> -<input type="number" name="age" value="65" id="id_age" min="0" required></p>""" + """ + <p><label for="id_writer">Writer:</label> + <select name="writer" id="id_writer" required> + <option value="">---------</option> + <option value="%s" selected>Bob Woodward</option> + <option value="%s">Mike Royko</option> + </select></p> + <p><label for="id_age">Age:</label> + <input type="number" name="age" value="65" id="id_age" min="0" required> + </p>""" % ( self.w_woodward.pk, self.w_royko.pk, @@ -2496,7 +2570,8 @@ class FileAndImageFieldTests(TestCase): instance = f.save() self.assertEqual(instance.file.name, "tests/test3.txt") - # Instance can be edited w/out re-uploading the file and existing file should be preserved. + # Instance can be edited w/out re-uploading the file and existing file + # should be preserved. f = TextFileForm({"description": "New Description"}, instance=instance) f.fields["file"].required = False self.assertTrue(f.is_valid()) @@ -2603,8 +2678,9 @@ class FileAndImageFieldTests(TestCase): self.assertEqual(instance.width, 16) self.assertEqual(instance.height, 16) - # Edit an instance that already has the (required) image defined in the model. This will not - # save the image again, but leave it exactly as it is. + # Edit an instance that already has the (required) image defined in the + # model. This will not save the image again, but leave it exactly as it + # is. f = ImageFileForm(data={"description": "Look, it changed"}, instance=instance) self.assertTrue(f.is_valid()) @@ -2700,7 +2776,8 @@ class FileAndImageFieldTests(TestCase): self.assertEqual(instance.width, 48) self.assertEqual(instance.height, 32) instance.delete() - # Test callable upload_to behavior that's dependent on the value of another field in the model + # Callable upload_to behavior that's dependent on the value of another + # field in the model. f = ImageFileForm( data={"description": "And a final one", "path": "foo"}, files={"image": SimpleUploadedFile("test4.png", image_data)}, @@ -2736,7 +2813,8 @@ class ModelOtherFieldTests(SimpleTestCase): bif.errors, { "biggie": [ - "Ensure this value is greater than or equal to -9223372036854775808." + "Ensure this value is greater than or equal to " + "-9223372036854775808." ] }, ) @@ -2785,7 +2863,10 @@ class ModelOtherFieldTests(SimpleTestCase): # 'created', non-editable, is excluded by default self.assertNotIn("created", ArticleForm().fields) - msg = "'created' cannot be specified for Article model form as it is a non-editable field" + msg = ( + "'created' cannot be specified for Article model form as it is a " + "non-editable field" + ) with self.assertRaisesMessage(FieldError, msg): class InvalidArticleForm(forms.ModelForm): @@ -2795,7 +2876,7 @@ class ModelOtherFieldTests(SimpleTestCase): def test_http_prefixing(self): """ - If the http:// prefix is omitted on form input, the field adds it again. (Refs #13613) + If the http:// prefix is omitted on form input, the field adds it again. """ class HomepageForm(forms.ModelForm): @@ -2936,11 +3017,15 @@ class OtherModelFormTests(TestCase): self.maxDiff = 1024 self.assertHTMLEqual( form.as_p(), - """<p><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="50" required></p> - <p><label for="id_colours">Colours:</label> - <select multiple name="colours" id="id_colours" required> - <option value="%(blue_pk)s">Blue</option> - </select></p>""" + """ + <p> + <label for="id_name">Name:</label> + <input id="id_name" type="text" name="name" maxlength="50" required></p> + <p><label for="id_colours">Colours:</label> + <select multiple name="colours" id="id_colours" required> + <option value="%(blue_pk)s">Blue</option> + </select></p> + """ % {"blue_pk": colour.pk}, ) @@ -2957,19 +3042,27 @@ class OtherModelFormTests(TestCase): form.as_p(), """ <p><label for="id_title">Title:</label> - <input id="id_title" maxlength="30" name="title" type="text" required></p> + <input id="id_title" maxlength="30" name="title" type="text" required> + </p> <p><label for="id_date_published">Date published:</label> - <input id="id_date_published" name="date_published" type="text" value="{0}" required> - <input id="initial-id_date_published" name="initial-date_published" type="hidden" value="{0}"></p> + <input id="id_date_published" name="date_published" type="text" value="{0}" + required> + <input id="initial-id_date_published" name="initial-date_published" + type="hidden" value="{0}"> + </p> <p><label for="id_mode">Mode:</label> <select id="id_mode" name="mode"> - <option value="di" selected>direct</option> - <option value="de">delayed</option></select> - <input id="initial-id_mode" name="initial-mode" type="hidden" value="di"></p> - <p><label for="id_category">Category:</label> <select id="id_category" name="category"> - <option value="1">Games</option> - <option value="2">Comics</option> - <option value="3" selected>Novel</option></select> - <input id="initial-id_category" name="initial-category" type="hidden" value="3"> + <option value="di" selected>direct</option> + <option value="de">delayed</option></select> + <input id="initial-id_mode" name="initial-mode" type="hidden" value="di"> + </p> + <p> + <label for="id_category">Category:</label> + <select id="id_category" name="category"> + <option value="1">Games</option> + <option value="2">Comics</option> + <option value="3" selected>Novel</option></select> + <input id="initial-id_category" name="initial-category" type="hidden" + value="3"> """.format( today_str ), @@ -3013,7 +3106,8 @@ class ModelFormCustomErrorTests(SimpleTestCase): self.assertFalse(form.is_valid()) self.assertHTMLEqual( str(form.errors["name1"]), - '<ul class="errorlist"><li>Model.clean() error messages (simpler syntax).</li></ul>', + '<ul class="errorlist">' + "<li>Model.clean() error messages (simpler syntax).</li></ul>", ) data = {"name1": "GLOBAL_ERROR", "name2": "ABC"} form = CustomErrorMessageForm(data) @@ -3289,7 +3383,9 @@ class LimitChoicesToTests(TestCase): class FormFieldCallbackTests(SimpleTestCase): def test_baseform_with_widgets_in_meta(self): - """Regression for #13095: Using base forms with widgets defined in Meta should not raise errors.""" + """ + Using base forms with widgets defined in Meta should not raise errors. + """ widget = forms.Textarea() class BaseForm(forms.ModelForm): |
