Merge pull request #28 from Nivl/master

Bootstrap 3.0
This commit is contained in:
tzangms
2013-08-26 14:20:29 -07:00
4 changed files with 109 additions and 35 deletions

View File

@@ -1,33 +1,39 @@
{% load bootstrap %} {% 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 %} {% if field|is_checkbox %}
<div class="controls"> <div class="{{ classes.single_value }}">
<label class="checkbox"> <div class="checkbox">
{{ field }} <span>{{ field.label }}</span> <label>
</label> {{ field }} <span>{{ field.label }}</span>
</label>
{% for error in field.errors %} {% for error in field.errors %}
<span class="help-inline">{{ error }}</span> <span class="help-block">{{ error }}</span>
{% endfor %} {% endfor %}
{% if field.help_text %} {% if field.help_text %}
<p class="help-block"> <p class="help-block">
{{ field.help_text|safe }} {{ field.help_text|safe }}
</p> </p>
{% endif %} {% endif %}
</div>
</div> </div>
{% else %}{% if field|is_radio %} {% else %}{% if field|is_radio %}
<label class="control-label">{{ field.label }}</label> <label class="control-label {{ classes.label }}">{{ field.label }}</label>
<div class="controls">
<div class="{{ classes.value }}">
{% for choice in field %} {% for choice in field %}
<label class="radio"> <div class="radio">
{{ choice.tag }} <label>
{{ choice.choice_label }} {{ choice.tag }}
</label> {{ choice.choice_label }}
</label>
</div>
{% endfor %} {% endfor %}
{% for error in field.errors %} {% for error in field.errors %}
<span class="help-inline">{{ error }}</span> <span class="help-block">{{ error }}</span>
{% endfor %} {% endfor %}
{% if field.help_text %} {% if field.help_text %}
@@ -36,22 +42,22 @@
</p> </p>
{% endif %} {% endif %}
</div> </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 }} {{ field }}
{% for error in field.errors %} {% for error in field.errors %}
<span class="help-inline">{{ error }}</span> <span class="help-block">{{ error }}</span>
{% endfor %} {% endfor %}
{% if field.help_text %} {% if field.help_text %}
<p class="help-block"> <p class="help-block">
{{ field.help_text|safe }} {{ field.help_text|safe }}
</p> </p>
{% endif %} {% endif %}
</div> </div>
{% endif %}{% endif %} {% endif %}{% endif %}
</div> </div>

View File

@@ -1,5 +1,5 @@
{% if form.non_field_errors %} {% if form.non_field_errors %}
<div class="alert alert-error"> <div class="alert alert-danger">
<a class="close" data-dismiss="alert">&times;</a> <a class="close" data-dismiss="alert">&times;</a>
{% for non_field_error in form.non_field_errors %} {% for non_field_error in form.non_field_errors %}
{{ non_field_error }} {{ non_field_error }}

View File

@@ -6,27 +6,90 @@ register = template.Library()
@register.filter @register.filter
def bootstrap(element): 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() element_type = element.__class__.__name__.lower()
if element_type == 'boundfield': if element_type == 'boundfield':
add_input_classes(element)
template = get_template("bootstrapform/field.html") template = get_template("bootstrapform/field.html")
context = Context({'field': element}) context = Context({'field': element, 'classes': markup_classes})
else: else:
has_management = getattr(element, 'management_form', None) has_management = getattr(element, 'management_form', None)
if has_management: if has_management:
for form in element.forms:
for field in form.visible_fields():
add_input_classes(field)
template = get_template("bootstrapform/formset.html") template = get_template("bootstrapform/formset.html")
context = Context({'formset': element}) context = Context({'formset': element, 'classes': markup_classes})
else: else:
for field in element.visible_fields():
add_input_classes(field)
template = get_template("bootstrapform/form.html") template = get_template("bootstrapform/form.html")
context = Context({'form': element}) context = Context({'form': element, 'classes': markup_classes})
return template.render(context) return template.render(context)
@register.filter @register.filter
def is_checkbox(field): def is_checkbox(field):
return field.field.widget.__class__.__name__.lower() == "checkboxinput" 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 @register.filter
def is_radio(field): def is_radio(field):
return field.field.widget.__class__.__name__.lower() == "radioselect" return field.field.widget.__class__.__name__.lower() == "radioselect"

View File

@@ -50,9 +50,14 @@ Usage
{{ form|bootstrap }} {{ form|bootstrap }}
# or use with individual field # or use with individual field
{{ form.<field name>|bootstrap }} - To output individual fields {{ 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 CHANGELOG
--------- ---------