diff --git a/widget_tweaks/templatetags/widget_tweaks.py b/widget_tweaks/templatetags/widget_tweaks.py index 2ae0bbd..096250a 100644 --- a/widget_tweaks/templatetags/widget_tweaks.py +++ b/widget_tweaks/templatetags/widget_tweaks.py @@ -1,9 +1,15 @@ import re import types +import django from django.template import Library, Node, Variable, TemplateSyntaxError +from django.utils.safestring import mark_safe + register = Library() +BACKWARDS_COMPATIBILITY = django.VERSION[:2] < (1, 8) + + def silence_without_field(fn): def wrapped(field, attr): if not field: @@ -17,7 +23,9 @@ def _process_field_attributes(field, attr, process): # split attribute name and value from 'attr:value' string params = attr.split(':', 1) attribute = params[0] - value = params[1] if len(params) == 2 else '' + value = params[1] if len(params) == 2 else True + if BACKWARDS_COMPATIBILITY and value is True: + value = '__BACKWARDS_COMPATIBILITY__' # decorate field.as_widget method with updated attributes old_as_widget = field.as_widget @@ -26,6 +34,8 @@ def as_widget(self, widget=None, attrs=None, only_initial=False): attrs = attrs or {} process(widget or self.field.widget, attrs, attribute, value) html = old_as_widget(widget, attrs, only_initial) + if BACKWARDS_COMPATIBILITY: + html = mark_safe(html.replace('="__BACKWARDS_COMPATIBILITY__"', '')) self.as_widget = old_as_widget return html diff --git a/widget_tweaks/tests.py b/widget_tweaks/tests.py index 454064a..402e90b 100644 --- a/widget_tweaks/tests.py +++ b/widget_tweaks/tests.py @@ -330,3 +330,18 @@ class RenderFieldFilter_field_type_widget_type_Test(TestCase): def test_field_type_widget_type_rendering_simple(self): res = render_form('
') assertIn('class="charfield textinput simple"', res) + + +class RenderFieldTagNonValueAttribute(TestCase): + def test_field_non_value(self): + res = render_form("{{ form.simple|attr:'required' }}", form=MyForm({})) + assertIn('required', res) + assertNotIn('required=', res) + + def test_field_empty_value(self): + res = render_form("{{ form.simple|attr:'required:' }}", form=MyForm({})) + assertIn('required=""', res) + + def test_field_other_value(self): + res = render_form("{{ form.simple|attr:'required:spam' }}", form=MyForm({})) + assertIn('required="spam"', res)