Skip to content

Commit

Permalink
Merge pull request #20 from eldarion/multiple-text-field
Browse files Browse the repository at this point in the history
Improve output of MultipleTextField widget
  • Loading branch information
jacobwegner committed Nov 9, 2017
2 parents ef6b1d4 + 1505f70 commit a414982
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 27 deletions.
13 changes: 13 additions & 0 deletions formly/fields.py
@@ -1,3 +1,5 @@
import json

from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
Expand All @@ -23,3 +25,14 @@ def validate(self, value):
code='maximum_choices',
params={'maximum': self.maximum_choices, 'selected': selected_count},
)


class MultipleTextField(forms.MultiValueField):
def __init__(self, fields_length, **kwargs):
fields = tuple(forms.CharField(max_length=200) for _ in range(fields_length))
kwargs.update({"fields": fields})
super(MultipleTextField, self).__init__(**kwargs)
self.fields_length = fields_length

def compress(self, data_list):
return json.dumps(data_list)
23 changes: 0 additions & 23 deletions formly/forms/__init__.py
@@ -1,23 +0,0 @@
import json
from django import forms


class MultipleTextField(forms.MultiValueField):
def __init__(self, fields_length, **kwargs):
fields = tuple(forms.CharField(max_length=200) for _ in range(fields_length))
kwargs.update({"fields": fields})
super(MultipleTextField, self).__init__(**kwargs)
self.fields_length = fields_length

def compress(self, data_list):
return json.dumps(data_list)


class MultiTextWidget(forms.MultiWidget):
def __init__(self, widgets_length, **kwargs):
widgets = (forms.TextInput() for _ in range(widgets_length))
kwargs.update({"widgets": widgets})
super(MultiTextWidget, self).__init__(**kwargs)

def decompress(self, value):
return json.loads(value) if value is not None else []
22 changes: 21 additions & 1 deletion formly/forms/widgets.py
@@ -1,4 +1,24 @@
from django.forms.widgets import RadioSelect
import json

from django.forms import TextInput
from django.forms.widgets import MultiWidget, RadioSelect
from django.template.loader import render_to_string


class MultiTextWidget(MultiWidget):
def __init__(self, widgets_length, **kwargs):
widgets = (TextInput() for _ in range(widgets_length))
kwargs.update({"widgets": widgets})
super(MultiTextWidget, self).__init__(**kwargs)

def decompress(self, value):
return json.loads(value) if value is not None else []

def format_output(self, rendered_widgets):
return render_to_string(
"formly/run/_multiple_input.html",
{"inputs": rendered_widgets}
)


class LikertSelect(RadioSelect):
Expand Down
5 changes: 2 additions & 3 deletions formly/models.py
Expand Up @@ -12,9 +12,8 @@

from jsonfield import JSONField

from .fields import LimitedMultipleChoiceField
from .forms import MultipleTextField, MultiTextWidget
from .forms.widgets import LikertSelect, RatingSelect
from .fields import LimitedMultipleChoiceField, MultipleTextField
from .forms.widgets import LikertSelect, MultiTextWidget, RatingSelect


@python_2_unicode_compatible
Expand Down
5 changes: 5 additions & 0 deletions formly/templates/formly/run/_multiple_input.html
@@ -0,0 +1,5 @@
<ol>
{% for input in inputs %}
<li class="form-inline full-width">{{ input }}</li>
{% endfor %}
</ol>

0 comments on commit a414982

Please sign in to comment.