summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2012-11-05 20:27:06 +0100
committerClaude Paroz <claude@2xlibre.net>2012-11-05 20:56:25 +0100
commita23c9c48a81e8efadeeb91d1403c9d797a348fe7 (patch)
treec4c99fee3a5a3be15f0da0360312348b58b0b442
parentc7d5e7c75bc1570751acb01f296ea8deaf70b43b (diff)
[1.5.x] Fixed #8627 -- Prevented textareas to swallow first newline content
Browsers consider the first newline in textareas as some display artifact, not real content. Hence they are not sending it back to the server. If we want to keep initial newlines, we have to add one when we render the textarea. Thanks bastih for the report and initial patch. Backport of 78f66691ee from master.
-rw-r--r--django/forms/widgets.py2
-rw-r--r--tests/regressiontests/forms/models.py6
-rw-r--r--tests/regressiontests/forms/templates/forms/article_form.html8
-rw-r--r--tests/regressiontests/forms/tests/__init__.py2
-rw-r--r--tests/regressiontests/forms/tests/widgets.py20
-rw-r--r--tests/regressiontests/forms/urls.py9
-rw-r--r--tests/regressiontests/forms/views.py8
7 files changed, 52 insertions, 3 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 061988c6c0..c761ea857d 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -403,7 +403,7 @@ class Textarea(Widget):
def render(self, name, value, attrs=None):
if value is None: value = ''
final_attrs = self.build_attrs(attrs, name=name)
- return format_html('<textarea{0}>{1}</textarea>',
+ return format_html('<textarea{0}>\r\n{1}</textarea>',
flatatt(final_attrs),
force_text(value))
diff --git a/tests/regressiontests/forms/models.py b/tests/regressiontests/forms/models.py
index 6e9c269356..bec31d12d7 100644
--- a/tests/regressiontests/forms/models.py
+++ b/tests/regressiontests/forms/models.py
@@ -83,4 +83,8 @@ class Group(models.Model):
class Cheese(models.Model):
- name = models.CharField(max_length=100)
+ name = models.CharField(max_length=100)
+
+
+class Article(models.Model):
+ content = models.TextField()
diff --git a/tests/regressiontests/forms/templates/forms/article_form.html b/tests/regressiontests/forms/templates/forms/article_form.html
new file mode 100644
index 0000000000..cde85051f6
--- /dev/null
+++ b/tests/regressiontests/forms/templates/forms/article_form.html
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <form method="post" action=".">
+ {{ form.as_p }}<br>
+ <input id="submit" type="submit">
+ </form>
+</body>
+</html>
diff --git a/tests/regressiontests/forms/tests/__init__.py b/tests/regressiontests/forms/tests/__init__.py
index 8e2150cea3..6708e54c79 100644
--- a/tests/regressiontests/forms/tests/__init__.py
+++ b/tests/regressiontests/forms/tests/__init__.py
@@ -18,4 +18,4 @@ from .regressions import FormsRegressionsTestCase
from .util import FormsUtilTestCase
from .validators import TestFieldWithValidators
from .widgets import (FormsWidgetTestCase, FormsI18NWidgetsTestCase,
- WidgetTests, ClearableFileInputTests)
+ WidgetTests, LiveWidgetTests, ClearableFileInputTests)
diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py
index 88469a79e8..31c0e65c7c 100644
--- a/tests/regressiontests/forms/tests/widgets.py
+++ b/tests/regressiontests/forms/tests/widgets.py
@@ -4,7 +4,9 @@ from __future__ import unicode_literals
import copy
import datetime
+from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.core.files.uploadedfile import SimpleUploadedFile
+from django.core.urlresolvers import reverse
from django.forms import *
from django.forms.widgets import RadioFieldRenderer
from django.utils import formats
@@ -15,6 +17,8 @@ from django.test import TestCase
from django.test.utils import override_settings
from django.utils.encoding import python_2_unicode_compatible
+from ..models import Article
+
class FormsWidgetTestCase(TestCase):
# Each Widget class corresponds to an HTML form widget. A Widget knows how to
@@ -1095,6 +1099,22 @@ class WidgetTests(TestCase):
self.assertFalse(form.is_valid())
+class LiveWidgetTests(AdminSeleniumWebDriverTestCase):
+ urls = 'regressiontests.forms.urls'
+
+ def test_textarea_trailing_newlines(self):
+ """
+ Test that a roundtrip on a ModelForm doesn't alter the TextField value
+ """
+ article = Article.objects.create(content="\nTst\n")
+ self.selenium.get('%s%s' % (self.live_server_url,
+ reverse('article_form', args=[article.pk])))
+ self.selenium.find_element_by_id('submit').submit()
+ article = Article.objects.get(pk=article.pk)
+ # Should be "\nTst\n" after #19251 is fixed
+ self.assertEqual(article.content, "\r\nTst\r\n")
+
+
@python_2_unicode_compatible
class FakeFieldFile(object):
"""
diff --git a/tests/regressiontests/forms/urls.py b/tests/regressiontests/forms/urls.py
new file mode 100644
index 0000000000..b482b6c45c
--- /dev/null
+++ b/tests/regressiontests/forms/urls.py
@@ -0,0 +1,9 @@
+from django.conf.urls import patterns, url
+from django.views.generic.edit import UpdateView
+
+from .views import ArticleFormView
+
+
+urlpatterns = patterns('',
+ url(r'^/model_form/(?P<pk>\d+)/$', ArticleFormView.as_view(), name="article_form"),
+)
diff --git a/tests/regressiontests/forms/views.py b/tests/regressiontests/forms/views.py
new file mode 100644
index 0000000000..4bf384363c
--- /dev/null
+++ b/tests/regressiontests/forms/views.py
@@ -0,0 +1,8 @@
+from django.views.generic.edit import UpdateView
+
+from .models import Article
+
+
+class ArticleFormView(UpdateView):
+ model = Article
+ success_url = '/'