Source code for templatetags.crispy_forms_field
from itertools import izip
from django import template
register = template.Library()
class_converter = {
"textinput": "textinput textInput",
"fileinput": "fileinput fileUpload",
"passwordinput": "textinput textInput",
}
@register.filter
[docs]def is_checkbox(field):
return field.field.widget.__class__.__name__.lower() == "checkboxinput"
@register.filter
[docs]def is_password(field):
return field.field.widget.__class__.__name__.lower() == "passwordinput"
@register.filter
[docs]def css_class(field):
return field.field.widget.__class__.__name__.lower()
[docs]def pairwise(iterable):
"s -> (s0,s1), (s2,s3), (s4, s5), ..."
a = iter(iterable)
return izip(a, a)
[docs]class CrispyFieldNode(template.Node):
def __init__(self, field, attrs):
self.field = template.Variable(field)
self.attrs = attrs
[docs] def render(self, context):
field = self.field.resolve(context)
class_name = field.field.widget.__class__.__name__.lower()
class_name = class_converter.get(class_name, class_name)
css_class = field.field.widget.attrs.get('class', '')
if css_class:
if css_class.find(class_name) == -1:
css_class += " %s" % class_name
else:
css_class = class_name
field.field.widget.attrs['class'] = css_class
for attribute_name, attribute in self.attrs.items():
field.field.widget.attrs[template.Variable(attribute_name).resolve(context)] = template.Variable(attribute).resolve(context)
return field
@register.tag(name="crispy_field")
[docs]def crispy_field(parser, token):
"""
{% crispy_field field attrs %}
"""
token = token.split_contents()
field = token.pop(1)
attrs = {}
tag_name = token.pop(0)
for attribute_name, value in pairwise(token):
attrs[attribute_name] = value
return CrispyFieldNode(field, attrs)