@@ -1,33 +1,39 @@
|
||||
{% load bootstrap %}
|
||||
<div class="control-group{% if field.errors %} error{% endif %}{% if field.field.required %} required{% endif %}">
|
||||
|
||||
<div class="form-group{% if field.errors %} has-error{% endif %}">
|
||||
{% if field|is_checkbox %}
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
{{ field }} <span>{{ field.label }}</span>
|
||||
</label>
|
||||
<div class="{{ classes.single_value }}">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
{{ field }} <span>{{ field.label }}</span>
|
||||
</label>
|
||||
|
||||
{% for error in field.errors %}
|
||||
<span class="help-inline">{{ error }}</span>
|
||||
{% endfor %}
|
||||
{% for error in field.errors %}
|
||||
<span class="help-block">{{ error }}</span>
|
||||
{% endfor %}
|
||||
|
||||
{% if field.help_text %}
|
||||
<p class="help-block">
|
||||
{{ field.help_text|safe }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if field.help_text %}
|
||||
<p class="help-block">
|
||||
{{ field.help_text|safe }}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}{% if field|is_radio %}
|
||||
<label class="control-label">{{ field.label }}</label>
|
||||
<div class="controls">
|
||||
<label class="control-label {{ classes.label }}">{{ field.label }}</label>
|
||||
|
||||
<div class="{{ classes.value }}">
|
||||
{% for choice in field %}
|
||||
<label class="radio">
|
||||
{{ choice.tag }}
|
||||
{{ choice.choice_label }}
|
||||
</label>
|
||||
<div class="radio">
|
||||
<label>
|
||||
{{ choice.tag }}
|
||||
{{ choice.choice_label }}
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{% for error in field.errors %}
|
||||
<span class="help-inline">{{ error }}</span>
|
||||
<span class="help-block">{{ error }}</span>
|
||||
{% endfor %}
|
||||
|
||||
{% if field.help_text %}
|
||||
@@ -36,22 +42,22 @@
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<label class="control-label" for="{{ field.auto_id }}">{{ field.label }}</label>
|
||||
|
||||
<div class="controls">
|
||||
{% else %}
|
||||
<label class="control-label {{ classes.label }}" for="{{ field.auto_id }}">{{ field.label }}</label>
|
||||
|
||||
<div class="{{ classes.value }}">
|
||||
{{ field }}
|
||||
|
||||
{% for error in field.errors %}
|
||||
<span class="help-inline">{{ error }}</span>
|
||||
{% endfor %}
|
||||
<span class="help-block">{{ error }}</span>
|
||||
{% endfor %}
|
||||
|
||||
{% if field.help_text %}
|
||||
<p class="help-block">
|
||||
{{ field.help_text|safe }}
|
||||
</p>
|
||||
<p class="help-block">
|
||||
{{ field.help_text|safe }}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
{% endif %}{% endif %}
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
{% if form.non_field_errors %}
|
||||
<div class="alert alert-error">
|
||||
<div class="alert alert-danger">
|
||||
<a class="close" data-dismiss="alert">×</a>
|
||||
{% for non_field_error in form.non_field_errors %}
|
||||
{{ non_field_error }}
|
||||
|
@@ -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"
|
||||
|
@@ -50,9 +50,14 @@ Usage
|
||||
{{ form|bootstrap }}
|
||||
|
||||
# or use with individual field
|
||||
|
||||
{{ form.<field name>|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
|
||||
---------
|
||||
|
||||
|
Reference in New Issue
Block a user