From 6d8f8ca23b4d37e2ae06063cfa446951bd65c3d5 Mon Sep 17 00:00:00 2001 From: Daniel Rozenberg Date: Tue, 30 Jun 2015 18:20:36 -0700 Subject: [PATCH 1/2] Support non-value attributes in HTML5 by setting their value to True, not '' --- widget_tweaks/templatetags/widget_tweaks.py | 2 +- widget_tweaks/tests.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/widget_tweaks/templatetags/widget_tweaks.py b/widget_tweaks/templatetags/widget_tweaks.py index 2ae0bbd..84f7677 100644 --- a/widget_tweaks/templatetags/widget_tweaks.py +++ b/widget_tweaks/templatetags/widget_tweaks.py @@ -17,7 +17,7 @@ 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 # decorate field.as_widget method with updated attributes old_as_widget = field.as_widget 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('
{{ form.simple }}
') 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) From 08d4ce93ec4e3db5008fa5c6f2537fe5188e5a31 Mon Sep 17 00:00:00 2001 From: Daniel Rozenberg Date: Wed, 2 Sep 2015 17:07:48 -0700 Subject: [PATCH 2/2] Fixed support for non-value attributes in Django < 1.8 --- widget_tweaks/templatetags/widget_tweaks.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/widget_tweaks/templatetags/widget_tweaks.py b/widget_tweaks/templatetags/widget_tweaks.py index 84f7677..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: @@ -18,6 +24,8 @@ def _process_field_attributes(field, attr, process): params = attr.split(':', 1) attribute = params[0] 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