Skip to content

Commit

Permalink
Fixed django#8627 -- Prevented textareas to swallow first newline con…
Browse files Browse the repository at this point in the history
…tent

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.
  • Loading branch information
claudep committed Nov 5, 2012
1 parent 39ec43b commit 78f6669
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 3 deletions.
2 changes: 1 addition & 1 deletion django/forms/widgets.py
Expand Up @@ -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))

Expand Down
6 changes: 5 additions & 1 deletion tests/regressiontests/forms/models.py
Expand Up @@ -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()
8 changes: 8 additions & 0 deletions 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>
2 changes: 1 addition & 1 deletion tests/regressiontests/forms/tests/__init__.py
Expand Up @@ -18,4 +18,4 @@
from .util import FormsUtilTestCase
from .validators import TestFieldWithValidators
from .widgets import (FormsWidgetTestCase, FormsI18NWidgetsTestCase,
WidgetTests, ClearableFileInputTests)
WidgetTests, LiveWidgetTests, ClearableFileInputTests)
20 changes: 20 additions & 0 deletions tests/regressiontests/forms/tests/widgets.py
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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):
"""
Expand Down
9 changes: 9 additions & 0 deletions 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"),
)
8 changes: 8 additions & 0 deletions 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 = '/'

0 comments on commit 78f6669

Please sign in to comment.