Fixed #21201 -- Improved customization of ClearableFileInput.
This commit is contained in:
parent
045b8d3267
commit
e622caaa85
|
@ -341,12 +341,10 @@ class ClearableFileInput(FileInput):
|
||||||
input_text = ugettext_lazy('Change')
|
input_text = ugettext_lazy('Change')
|
||||||
clear_checkbox_label = ugettext_lazy('Clear')
|
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>'
|
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):
|
def clear_checkbox_name(self, name):
|
||||||
"""
|
"""
|
||||||
Given the name of the file input, return the name of the clear checkbox
|
Given the name of the file input, return the name of the clear checkbox
|
||||||
|
@ -360,6 +358,21 @@ class ClearableFileInput(FileInput):
|
||||||
"""
|
"""
|
||||||
return name + '_id'
|
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):
|
def render(self, name, value, attrs=None):
|
||||||
substitutions = {
|
substitutions = {
|
||||||
'initial_text': self.initial_text,
|
'initial_text': self.initial_text,
|
||||||
|
@ -370,11 +383,9 @@ class ClearableFileInput(FileInput):
|
||||||
template = '%(input)s'
|
template = '%(input)s'
|
||||||
substitutions['input'] = super(ClearableFileInput, self).render(name, value, attrs)
|
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
|
template = self.template_with_initial
|
||||||
substitutions['initial'] = format_html(self.url_markup_template,
|
substitutions.update(self.get_template_substitution_values(value))
|
||||||
value.url,
|
|
||||||
force_text(value))
|
|
||||||
if not self.is_required:
|
if not self.is_required:
|
||||||
checkbox_name = self.clear_checkbox_name(name)
|
checkbox_name = self.clear_checkbox_name(name)
|
||||||
checkbox_id = self.clear_checkbox_id(checkbox_name)
|
checkbox_id = self.clear_checkbox_id(checkbox_name)
|
||||||
|
|
|
@ -522,6 +522,10 @@ Miscellaneous
|
||||||
opposed to the instance name which you can still customize using
|
opposed to the instance name which you can still customize using
|
||||||
``AdminSite(name="...")``.
|
``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:
|
.. _deprecated-features-1.8:
|
||||||
|
|
||||||
Features deprecated in 1.8
|
Features deprecated in 1.8
|
||||||
|
|
|
@ -1249,3 +1249,16 @@ class ClearableFileInputTests(TestCase):
|
||||||
data={'myfile-clear': True},
|
data={'myfile-clear': True},
|
||||||
files={'myfile': f},
|
files={'myfile': f},
|
||||||
name='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" />'
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue