diff --git a/bootstrapform/templates/bootstrapform/field.html b/bootstrapform/templates/bootstrapform/field.html index 7c48984..e59fa6e 100644 --- a/bootstrapform/templates/bootstrapform/field.html +++ b/bootstrapform/templates/bootstrapform/field.html @@ -1,33 +1,39 @@ {% load bootstrap %} -
+ +
{% if field|is_checkbox %} -
- +
+
+ - {% for error in field.errors %} - {{ error }} - {% endfor %} + {% for error in field.errors %} + {{ error }} + {% endfor %} - {% if field.help_text %} -

- {{ field.help_text|safe }} -

- {% endif %} + {% if field.help_text %} +

+ {{ field.help_text|safe }} +

+ {% endif %} +
{% else %}{% if field|is_radio %} - -
+ + +
{% for choice in field %} - +
+ +
{% endfor %} {% for error in field.errors %} - {{ error }} + {{ error }} {% endfor %} {% if field.help_text %} @@ -36,22 +42,22 @@

{% endif %}
- {% else %} - -
+ {% else %} + + +
{{ field }} {% for error in field.errors %} - {{ error }} - {% endfor %} + {{ error }} + {% endfor %} {% if field.help_text %} -

- {{ field.help_text|safe }} -

+

+ {{ field.help_text|safe }} +

{% endif %} -
{% endif %}{% endif %}
diff --git a/bootstrapform/templates/bootstrapform/form.html b/bootstrapform/templates/bootstrapform/form.html index 2efee91..37661ae 100644 --- a/bootstrapform/templates/bootstrapform/form.html +++ b/bootstrapform/templates/bootstrapform/form.html @@ -1,5 +1,5 @@ {% if form.non_field_errors %} -
+
× {% for non_field_error in form.non_field_errors %} {{ non_field_error }} diff --git a/bootstrapform/templatetags/bootstrap.py b/bootstrapform/templatetags/bootstrap.py index 9f29b27..3ab5aac 100644 --- a/bootstrapform/templatetags/bootstrap.py +++ b/bootstrapform/templatetags/bootstrap.py @@ -6,27 +6,90 @@ register = template.Library() @register.filter def bootstrap(element): + markup_classes = {'label': '', 'value': '', 'single_value': ''} + return render(element, markup_classes) + + +@register.filter +def bootstrap_inline(element): + markup_classes = {'label': 'sr-only', 'value': '', 'single_value': ''} + return render(element, markup_classes) + + +@register.filter +def bootstrap_horizontal(element, label_cols={}): + if not label_cols: + label_cols = 'col-sm-2 col-lg-2' + + markup_classes = {'label': label_cols, + 'value': '', + 'single_value': ''} + + for cl in label_cols.split(' '): + splited_class = cl.split('-') + + try: + value_nb_cols = int(splited_class[-1]) + except ValueError: + value_nb_cols = 12 + + if value_nb_cols >= 12: + splited_class[-1] = 12 + else: + offset_class = cl.split('-') + offset_class[-1] = 'offset-' + str(value_nb_cols) + splited_class[-1] = str(12 - value_nb_cols) + markup_classes['single_value'] += ' ' + '-'.join(offset_class) + markup_classes['single_value'] += ' ' + '-'.join(splited_class) + + markup_classes['value'] += ' ' + '-'.join(splited_class) + + return render(element, markup_classes) + + +def add_input_classes(field): + if not is_checkbox(field) and not is_multiple_checkbox(field) and not is_radio(field): + field_classes = field.field.widget.attrs.get('class', '') + field_classes += ' form-control' + field.field.widget.attrs['class'] = field_classes + + +def render(element, markup_classes): element_type = element.__class__.__name__.lower() if element_type == 'boundfield': + add_input_classes(element) template = get_template("bootstrapform/field.html") - context = Context({'field': element}) + context = Context({'field': element, 'classes': markup_classes}) else: has_management = getattr(element, 'management_form', None) if has_management: + for form in element.forms: + for field in form.visible_fields(): + add_input_classes(field) + template = get_template("bootstrapform/formset.html") - context = Context({'formset': element}) + context = Context({'formset': element, 'classes': markup_classes}) else: + for field in element.visible_fields(): + add_input_classes(field) + template = get_template("bootstrapform/form.html") - context = Context({'form': element}) - + context = Context({'form': element, 'classes': markup_classes}) + return template.render(context) + @register.filter def is_checkbox(field): return field.field.widget.__class__.__name__.lower() == "checkboxinput" +@register.filter +def is_multiple_checkbox(field): + return field.field.widget.__class__.__name__.lower() == "checkboxselectmultiple" + + @register.filter def is_radio(field): return field.field.widget.__class__.__name__.lower() == "radioselect" diff --git a/docs/install.rst b/docs/install.rst index c07331f..9ed7b2d 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -50,9 +50,14 @@ Usage {{ form|bootstrap }} # or use with individual field - {{ form.|bootstrap }} - To output individual fields + # For horizontal forms + {{ form|bootstrap_horizontal }} + + # Or with custom size (default is 'col-lg-2 col-sm-2') + {{ form|bootstrap_horizontal:'col-lg-4' }} + CHANGELOG ---------