From e622caaa857e74cef4fe7757b6e5b802af814788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Z=C3=ADma?= Date: Fri, 25 Oct 2013 09:13:00 +0200 Subject: [PATCH] Fixed #21201 -- Improved customization of ClearableFileInput. --- django/forms/widgets.py | 25 ++++++++++++++++++------- docs/releases/1.8.txt | 4 ++++ tests/forms_tests/tests/test_widgets.py | 13 +++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/django/forms/widgets.py b/django/forms/widgets.py index a16b554385..6b35fa9959 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -341,12 +341,10 @@ class ClearableFileInput(FileInput): input_text = ugettext_lazy('Change') clear_checkbox_label = ugettext_lazy('Clear') - template_with_initial = '%(initial_text)s: %(initial)s %(clear_template)s
%(input_text)s: %(input)s' + template_with_initial = '%(initial_text)s: %(initial)s %(clear_template)s
%(input_text)s: %(input)s' template_with_clear = '%(clear)s ' - url_markup_template = '{1}' - def clear_checkbox_name(self, name): """ Given the name of the file input, return the name of the clear checkbox @@ -360,6 +358,21 @@ class ClearableFileInput(FileInput): """ return name + '_id' + def is_initial(self, value): + """ + Return whether value is considered to be initial value. + """ + return bool(value and hasattr(value, 'url')) + + def get_template_substitution_values(self, value): + """ + Return value-related substitutions. + """ + return { + 'initial': conditional_escape(value), + 'initial_url': conditional_escape(value.url), + } + def render(self, name, value, attrs=None): substitutions = { 'initial_text': self.initial_text, @@ -370,11 +383,9 @@ class ClearableFileInput(FileInput): template = '%(input)s' substitutions['input'] = super(ClearableFileInput, self).render(name, value, attrs) - if value and hasattr(value, "url"): + if self.is_initial(value): template = self.template_with_initial - substitutions['initial'] = format_html(self.url_markup_template, - value.url, - force_text(value)) + substitutions.update(self.get_template_substitution_values(value)) if not self.is_required: checkbox_name = self.clear_checkbox_name(name) checkbox_id = self.clear_checkbox_id(checkbox_name) diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index ea5101ff72..7d9a71c6e5 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -522,6 +522,10 @@ Miscellaneous opposed to the instance name which you can still customize using ``AdminSite(name="...")``. +* Interal changes were made to the :class:`~django.forms.ClearableFileInput` + widget to allow more customization. The undocumented ``url_markup_template`` + attribute was removed in favor of ``template_with_initial``. + .. _deprecated-features-1.8: Features deprecated in 1.8 diff --git a/tests/forms_tests/tests/test_widgets.py b/tests/forms_tests/tests/test_widgets.py index 1f19e98389..02048a1fc1 100644 --- a/tests/forms_tests/tests/test_widgets.py +++ b/tests/forms_tests/tests/test_widgets.py @@ -1249,3 +1249,16 @@ class ClearableFileInputTests(TestCase): data={'myfile-clear': True}, files={'myfile': f}, name='myfile'), f) + + def test_render_custom_template(self): + widget = ClearableFileInput() + widget.template_with_initial = ( + '%(initial_text)s: %(initial)s ' + '%(clear_template)s
%(input_text)s: %(input)s' + ) + self.assertHTMLEqual( + widget.render('myfile', FakeFieldFile()), + 'Currently: something ' + ' ' + '
Change: ' + )