Skip to content

Instantly share code, notes, and snippets.

Created January 4, 2017 21:17
Show Gist options
  • Save anonymous/098c076f626466dc3154e3a6da02d996 to your computer and use it in GitHub Desktop.
Save anonymous/098c076f626466dc3154e3a6da02d996 to your computer and use it in GitHub Desktop.
diff --git a/django/conf/project_template/project_name/settings.py-tpl b/django/conf/project_template/project_name/settings.py-tpl
index 7dfe186929..969b7404ec 100644
--- a/django/conf/project_template/project_name/settings.py-tpl
+++ b/django/conf/project_template/project_name/settings.py-tpl
@@ -63,6 +63,7 @@ TEMPLATES = [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
+ 'keep_trailing_newline': False,
},
},
]
diff --git a/django/forms/renderers.py b/django/forms/renderers.py
index d0b3c3e2db..a976d540f4 100644
--- a/django/forms/renderers.py
+++ b/django/forms/renderers.py
@@ -42,7 +42,9 @@ class EngineMixin(object):
'APP_DIRS': True,
'DIRS': [os.path.join(ROOT, self.backend.app_dirname)],
'NAME': 'djangoforms',
- 'OPTIONS': {},
+ 'OPTIONS': {
+ 'keep_trailing_newline': False
+ },
})
diff --git a/django/template/engine.py b/django/template/engine.py
index 729c484a67..25e6078442 100644
--- a/django/template/engine.py
+++ b/django/template/engine.py
@@ -18,7 +18,8 @@ class Engine(object):
def __init__(self, dirs=None, app_dirs=False, context_processors=None,
debug=False, loaders=None, string_if_invalid='',
- file_charset='utf-8', libraries=None, builtins=None, autoescape=True):
+ file_charset='utf-8', libraries=None, builtins=None, autoescape=True,
+ keep_trailing_newline=True):
if dirs is None:
dirs = []
if context_processors is None:
@@ -47,10 +48,12 @@ class Engine(object):
self.string_if_invalid = string_if_invalid
self.file_charset = file_charset
self.libraries = libraries
+ self.keep_trailing_newline = keep_trailing_newline
self.template_libraries = self.get_template_libraries(libraries)
self.builtins = self.default_builtins + builtins
self.template_builtins = self.get_template_builtins(self.builtins)
+
@staticmethod
@lru_cache.lru_cache()
def get_default():
diff --git a/django/template/loader_tags.py b/django/template/loader_tags.py
index 2ed145c248..c3a6489adf 100644
--- a/django/template/loader_tags.py
+++ b/django/template/loader_tags.py
@@ -207,9 +207,13 @@ class IncludeNode(Node):
for name, var in six.iteritems(self.extra_context)
}
if self.isolated_context:
- return template.render(context.new(values))
- with context.push(**values):
- return template.render(context)
+ rendered_template = template.render(context.new(values))
+ else:
+ with context.push(**values):
+ rendered_template = template.render(context)
+ if not context.template.engine.keep_trailing_newline:
+ rendered_template = rendered_template.rstrip('\r\n')
+ return rendered_template
except Exception as e:
if context.template.engine.debug:
raise
diff --git a/tests/forms_tests/widget_tests/base.py b/tests/forms_tests/widget_tests/base.py
index dbbea25d7a..490f033bad 100644
--- a/tests/forms_tests/widget_tests/base.py
+++ b/tests/forms_tests/widget_tests/base.py
@@ -17,11 +17,12 @@ class WidgetTest(SimpleTestCase):
cls.renderers = [cls.django_renderer] + ([cls.jinja2_renderer] if cls.jinja2_renderer else [])
super(WidgetTest, cls).setUpClass()
- def check_html(self, widget, name, value, html='', attrs=None, **kwargs):
+ def check_html(self, widget, name, value, html='', attrs=None, strict=False, **kwargs):
+ assertEqual = self.assertEqual if strict else self.assertHTMLEqual
if self.jinja2_renderer:
output = widget.render(name, value, attrs=attrs, renderer=self.jinja2_renderer, **kwargs)
# Django escapes quotes with '"' while Jinja2 uses '"'.
- self.assertHTMLEqual(output.replace('"', '"'), html)
+ assertEqual(output.replace('"', '"'), html)
output = widget.render(name, value, attrs=attrs, renderer=self.django_renderer, **kwargs)
- self.assertHTMLEqual(output, html)
+ assertEqual(output, html)
diff --git a/tests/forms_tests/widget_tests/test_widget.py b/tests/forms_tests/widget_tests/test_widget.py
index 3911627a0c..bbf83fa327 100644
--- a/tests/forms_tests/widget_tests/test_widget.py
+++ b/tests/forms_tests/widget_tests/test_widget.py
@@ -1,12 +1,18 @@
from __future__ import unicode_literals
from django.forms import Widget
-from django.test import SimpleTestCase
+from django.forms.widgets import Input
+from .base import WidgetTest
-class WidgetTests(SimpleTestCase):
+
+class WidgetTests(WidgetTest):
def test_value_omitted_from_data(self):
widget = Widget()
self.assertIs(widget.value_omitted_from_data({}, {}, 'field'), True)
self.assertIs(widget.value_omitted_from_data({'field': 'value'}, {}, 'field'), False)
+
+ def test_no_trailing_newline_in_attrs(self):
+ self.check_html(Input(), 'name', 'value', strict=True,
+ html='<input type="None" name="name" value="value" />')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment