Unverified Commit 801a50b2 authored by Petrus Janse van Rensburg's avatar Petrus Janse van Rensburg Committed by GitHub

Merge pull request #1756 from GrayAn/checkboxlist

CheckboxListField: alternative field for many-to-many relationship
parents 3bd34b10 ff861de7
......@@ -15,6 +15,7 @@ API
mod_actions
mod_contrib_sqla
mod_contrib_sqla_fields
mod_contrib_mongoengine
mod_contrib_mongoengine_fields
mod_contrib_peewee
......
``flask_admin.contrib.sqla.fields``
===================================
.. automodule:: flask_admin.contrib.sqla.fields
.. autoclass:: QuerySelectField
:members:
.. autoclass:: QuerySelectMultipleField
:members:
.. autoclass:: CheckboxListField
:members:
......@@ -13,6 +13,7 @@ except ImportError:
from .tools import get_primary_key
from flask_admin._compat import text_type, string_types, iteritems
from flask_admin.contrib.sqla.widgets import CheckboxListInput
from flask_admin.form import FormOpts, BaseForm, Select2Widget
from flask_admin.model.fields import InlineFieldList, InlineModelFormField
from flask_admin.babel import lazy_gettext
......@@ -181,6 +182,30 @@ class QuerySelectMultipleField(QuerySelectField):
raise ValidationError(self.gettext(u'Not a valid choice'))
class CheckboxListField(QuerySelectMultipleField):
"""
Alternative field for many-to-many relationships.
Can be used instead of `QuerySelectMultipleField`.
Appears as the list of checkboxes.
Example::
class MyView(ModelView):
form_columns = (
'languages',
)
form_args = {
'languages': {
'query_factory': Language.query,
},
}
form_overrides = {
'languages': CheckboxListField,
}
"""
widget = CheckboxListInput()
class HstoreForm(BaseForm):
""" Form used in InlineFormField/InlineHstoreList for HSTORE columns """
key = StringField(lazy_gettext('Key'))
......
from wtforms.widgets.core import HTMLString, escape
class CheckboxListInput:
"""
Alternative widget for many-to-many relationships.
Appears as the list of checkboxes.
"""
template = (
'<div class="checkbox">'
' <label>'
' <input id="%(id)s" name="%(name)s" value="%(id)s" '
'type="checkbox"%(selected)s>%(label)s'
' </label>'
'</div>'
)
def __call__(self, field, **kwargs):
items = []
for val, label, selected in field.iter_choices():
args = {
'id': val,
'name': field.name,
'label': escape(label),
'selected': ' checked' if selected else '',
}
items.append(self.template % args)
return HTMLString(''.join(items))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment