Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion widget_tweaks/templatetags/widget_tweaks.py
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -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
Expand All @@ -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

Expand Down
15 changes: 15 additions & 0 deletions widget_tweaks/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,3 +330,18 @@ class RenderFieldFilter_field_type_widget_type_Test(TestCase):
def test_field_type_widget_type_rendering_simple(self):
res = render_form('<div class="{{ form.simple|field_type }} {{ form.simple|widget_type }} {{ form.simple.html_name }}">{{ form.simple }}</div>')
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)