Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.5.x] Fixed #8627 -- Prevented textareas to swallow first newline c…

…ontent

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 78f6669 from master.
  • Loading branch information...
commit a23c9c48a81e8efadeeb91d1403c9d797a348fe7 1 parent c7d5e7c
@claudep claudep authored
View
2  django/forms/widgets.py
@@ -403,7 +403,7 @@ def __init__(self, attrs=None):
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))
View
6 tests/regressiontests/forms/models.py
@@ -83,4 +83,8 @@ def __str__(self):
class Cheese(models.Model):
- name = models.CharField(max_length=100)
+ name = models.CharField(max_length=100)
+
+
+class Article(models.Model):
+ content = models.TextField()
View
8 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>
View
2  tests/regressiontests/forms/tests/__init__.py
@@ -18,4 +18,4 @@
from .util import FormsUtilTestCase
from .validators import TestFieldWithValidators
from .widgets import (FormsWidgetTestCase, FormsI18NWidgetsTestCase,
- WidgetTests, ClearableFileInputTests)
+ WidgetTests, LiveWidgetTests, ClearableFileInputTests)
View
20 tests/regressiontests/forms/tests/widgets.py
@@ -4,7 +4,9 @@
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.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 SplitDateRequiredForm(Form):
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):
"""
View
9 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"),
+)
View
8 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 = '/'
Please sign in to comment.
Something went wrong with that request. Please try again.