Skip to content

Commit 3c267e7

Browse files
authored
Merge pull request #24 from michaelmarziani/master
Add support for Icons
2 parents b4b1308 + 312d00c commit 3c267e7

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ In your base.html:
3737
<head>
3838
3939
{% block css %}
40+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
4041
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.1/css/materialize.min.css" integrity="sha256-qj3p6P1fJIV+Ndv7RW1ovZI2UhOuboj9GcODzcNFIN8=" crossorigin="anonymous" />
4142
{% endblock css %}
4243
@@ -95,6 +96,12 @@ Use it like this, simple.
9596
{{ form|materializecss:'m6' }}
9697

9798

99+
### Icons support
100+
This is most useful for adding a descriptive icon when you are creating a custom layout by building the form one field at a time. Substitue FIELD_NAME below with one of the field names from your form.
101+
```html
102+
{{ form.FIELD_NAME|materializecss:'s12 m6, icon=person' }}
103+
{{ form.FIELD_NAME|materializecss:'custom_size=s12 m6, icon=person' }}
104+
```
98105

99106
## Demo
100107

materializecssform/templates/materializecssform/field.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
{% if field|is_checkbox %}
55
<div class="col {{ classes.label }} {{ classes.value }} {{ classes.single_value }}">
66
<div class="{% if field.field.required and form.required_css_class %}{{ form.required_css_class }}{% endif %}">
7+
{% if classes.icon %}
8+
<i class="material-icons prefix">{{ classes.icon }}</i>
9+
{% endif %}
710
<label>
811

912
{{ field }}
@@ -25,6 +28,9 @@
2528
{% elif field|is_radio %}
2629
<div class="col {{ classes.label }} {{ classes.value }} {{ classes.single_value }}">
2730
<div class="{% if field.field.required and form.required_css_class %}{{ form.required_css_class }}{% endif %}">
31+
{% if classes.icon %}
32+
<i class="material-icons prefix">{{ classes.icon }}</i>
33+
{% endif %}
2834
<label>
2935
{{ field }}
3036
{% if field.auto_id %}
@@ -43,6 +49,9 @@
4349
</div>
4450
{% elif field|is_date_input or field|is_datetime_input %}
4551
<div class="input-field col {{ classes.label }} {{ classes.value }} {{ classes.single_value }}">
52+
{% if classes.icon %}
53+
<i class="material-icons prefix">{{ classes.icon }}</i>
54+
{% endif %}
4655

4756
<input type="date" id="{{ field.auto_id }}" name="{{ field.html_name }}" class="datepicker" value="{% if field.value %}{{ field.value }}{% endif %}" {% include 'materializecssform/attrs.html' %} >
4857
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
@@ -61,6 +70,9 @@
6170
{% elif field|is_select %}
6271
<div class="input-field col {{ classes.label }} {{ classes.value }} {{ classes.single_value }}">
6372
{% if field|is_select_multiple %}
73+
{% if classes.icon %}
74+
<i class="material-icons prefix">{{ classes.icon }}</i>
75+
{% endif %}
6476
<select multiple name="{{ field.name }}">
6577
{% for choice in field %}
6678
{{ choice.tag }}
@@ -81,6 +93,9 @@
8193
{% endif %}
8294

8395
{% else %}
96+
{% if classes.icon %}
97+
<i class="material-icons prefix">{{ classes.icon }}</i>
98+
{% endif %}
8499
<select name="{{ field.name }}">
85100
{% for choice in field %}
86101
{{ choice.tag }}
@@ -139,6 +154,9 @@
139154

140155
{% elif field|is_textarea %}
141156
<div class="input-field col {{ classes.label }} {{ classes.value }} {{ classes.single_value }">
157+
{% if classes.icon %}
158+
<i class="material-icons prefix">{{ classes.icon }}</i>
159+
{% endif %}
142160
<textarea id="{{ field.auto_id }}" class="materialize-textarea" name="{{field.html_name}}" {% include 'materializecssform/attrs.html' %} >{% if field.value %}{{ field.value }}{% endif %}</textarea>
143161
{% if field.auto_id %}
144162
<label class="{% if field.field.required %}{{ form.required_css_class }}{% endif %}" for="{{ field.auto_id }}">{{ field.label }}</label>
@@ -165,6 +183,9 @@
165183
<div class="file-field input-field">
166184
<div class="btn">
167185
<span>{{ field.label }}</span>
186+
{% if classes.icon %}
187+
<i class="material-icons prefix">{{ classes.icon }}</i>
188+
{% endif %}
168189
{{ field }}
169190
</div>
170191
<div class="file-path-wrapper">
@@ -176,6 +197,9 @@
176197
{% else %}
177198

178199
<div class="input-field col {{ classes.label }} {{ classes.value }} {{ classes.single_value }}">
200+
{% if classes.icon %}
201+
<i class="material-icons prefix">{{ classes.icon }}</i>
202+
{% endif %}
179203
{{ field }}
180204
{% if field.auto_id %}
181205
<label class="{% if field.field.required %}{{ form.required_css_class }}{% endif %}" for="{{ field.auto_id }}">{{ field.label }}</label>

materializecssform/templatetags/materializecss.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,38 @@
22
from django.template.loader import get_template
33
from django import template
44
from django.forms.fields import DateTimeField, DateField
5+
from django.http import QueryDict
56

67
from materializecssform import config
78

89
register = template.Library()
910

1011
@register.filter
11-
def materializecss(element, label_cols={}):
12-
if not label_cols:
12+
def materializecss(element, options={}):
13+
if not options:
1314
label_cols = 's12'
14-
15-
markup_classes = {'label': label_cols, 'value': '', 'single_value': ''}
15+
icon = ''
16+
else:
17+
# Split options string into a list of arguments
18+
arguments = [arg.strip() for arg in options.split(',')]
19+
20+
# Check the first argument to see if it's of form argument=value
21+
if '=' not in arguments[0]:
22+
# If not, it's a custom size, so use that
23+
label_cols = arguments[0]
24+
# Remove this from the arguments list
25+
arguments.pop(0)
26+
27+
# Join the remaining arguments into a querystring for easy parsing
28+
options = '&'.join(arguments)
29+
qs = QueryDict(options)
30+
# Check to see if a custom size was passed in this fashion and if so prefer it
31+
if qs.get('custom_size'):
32+
label_cols = qs.get('custom_size')
33+
# Get icon if it's been set
34+
icon = qs.get('icon', default='')
35+
36+
markup_classes = {'label': label_cols, 'value': '', 'single_value': '', 'icon': icon}
1637
return render(element, markup_classes)
1738

1839

0 commit comments

Comments
 (0)