[1.7.x] Ensured bound field renders as unicode safe data

Refs #22950.
Backport of 920904921 from master.
This commit is contained in:
Claude Paroz 2014-07-05 11:40:08 +02:00
parent b68c7a5abb
commit 83a185a3f7
2 changed files with 19 additions and 2 deletions

View File

@ -557,7 +557,7 @@ class BoundField(object):
name = self.html_name name = self.html_name
else: else:
name = self.html_initial_name name = self.html_initial_name
return widget.render(name, self.value(), attrs=attrs) return force_text(widget.render(name, self.value(), attrs=attrs))
def as_text(self, attrs=None, **kwargs): def as_text(self, attrs=None, **kwargs):
""" """

View File

@ -22,7 +22,9 @@ from django.template import Template, Context
from django.test import TestCase from django.test import TestCase
from django.test.utils import str_prefix from django.test.utils import str_prefix
from django.utils.datastructures import MultiValueDict, MergeDict from django.utils.datastructures import MultiValueDict, MergeDict
from django.utils.safestring import mark_safe from django.utils.encoding import force_text
from django.utils.html import format_html
from django.utils.safestring import mark_safe, SafeData
from django.utils import six from django.utils import six
@ -1335,6 +1337,21 @@ class FormsTestCase(TestCase):
self.assertEqual(bound['password'].value(), 'foo') self.assertEqual(bound['password'].value(), 'foo')
self.assertEqual(unbound['password'].value(), None) self.assertEqual(unbound['password'].value(), None)
def test_boundfield_rendering(self):
"""
Python 2 issue: Test that rendering a BoundField with bytestring content
doesn't lose it's safe string status (#22950).
"""
class CustomWidget(TextInput):
def render(self, name, value, attrs=None):
return format_html(str('<input{0} />'), ' id=custom')
class SampleForm(Form):
name = CharField(widget=CustomWidget)
f = SampleForm(data={'name': 'bar'})
self.assertIsInstance(force_text(f['name']), SafeData)
def test_initial_datetime_values(self): def test_initial_datetime_values(self):
now = datetime.datetime.now() now = datetime.datetime.now()
# Nix microseconds (since they should be ignored). #22502 # Nix microseconds (since they should be ignored). #22502