summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlastimil Zíma <vlastimil.zima@nic.cz>2013-10-25 09:13:00 +0200
committerTim Graham <timograham@gmail.com>2014-08-29 09:40:08 -0400
commite622caaa857e74cef4fe7757b6e5b802af814788 (patch)
tree6d9bd9afb5a31cfd7489db136bb73bb56d483959
parent045b8d32671f6fc19a4452d6e514d54c37834301 (diff)
Fixed #21201 -- Improved customization of ClearableFileInput.
-rw-r--r--django/forms/widgets.py25
-rw-r--r--docs/releases/1.8.txt4
-rw-r--r--tests/forms_tests/tests/test_widgets.py13
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<br />%(input_text)s: %(input)s'
+ template_with_initial = '%(initial_text)s: <a href="%(initial_url)s">%(initial)s</a> %(clear_template)s<br />%(input_text)s: %(input)s'
template_with_clear = '%(clear)s <label for="%(clear_checkbox_id)s">%(clear_checkbox_label)s</label>'
- url_markup_template = '<a href="{0}">{1}</a>'
-
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: <img src="%(initial_url)s" alt="%(initial)s" /> '
+ '%(clear_template)s<br />%(input_text)s: %(input)s'
+ )
+ self.assertHTMLEqual(
+ widget.render('myfile', FakeFieldFile()),
+ 'Currently: <img src="something" alt="something" /> '
+ '<input type="checkbox" name="myfile-clear" id="myfile-clear_id" /> '
+ '<label for="myfile-clear_id">Clear</label><br />Change: <input type="file" name="myfile" />'
+ )