Commit 510d2dfb authored by Serge S. Koval's avatar Serge S. Koval

Added support for MongoEngine ListField(ReferenceField) AJAX-based multi-select

parent a797f934
...@@ -76,13 +76,19 @@ class UserView(ModelView): ...@@ -76,13 +76,19 @@ class UserView(ModelView):
column_searchable_list = ('name', 'password') column_searchable_list = ('name', 'password')
form_ajax_refs = {
'tags': {
'fields': ('name',)
}
}
class TodoView(ModelView): class TodoView(ModelView):
column_filters = ['done'] column_filters = ['done']
form_ajax_refs = { form_ajax_refs = {
'user': { 'user': {
'fields': ('name',) 'fields': ['name']
} }
} }
......
...@@ -74,7 +74,14 @@ def create_ajax_loader(model, name, field_name, opts): ...@@ -74,7 +74,14 @@ def create_ajax_loader(model, name, field_name, opts):
if prop is None: if prop is None:
raise ValueError('Model %s does not have field %s.' % (model, field_name)) raise ValueError('Model %s does not have field %s.' % (model, field_name))
# TODO: Check for field ftype = type(prop).__name__
if ftype == 'ListField':
prop = prop.field
ftype = type(prop).__name__
if ftype != 'ReferenceField':
raise ValueError('Dont know how to convert %s type for AJAX loader' % ftype)
remote_model = prop.document_type remote_model = prop.document_type
return QueryAjaxModelLoader(name, remote_model, **opts) return QueryAjaxModelLoader(name, remote_model, **opts)
......
...@@ -6,7 +6,7 @@ from flask.ext.mongoengine.wtf import orm, fields as mongo_fields ...@@ -6,7 +6,7 @@ from flask.ext.mongoengine.wtf import orm, fields as mongo_fields
from flask.ext.admin import form from flask.ext.admin import form
from flask.ext.admin.model.form import FieldPlaceholder from flask.ext.admin.model.form import FieldPlaceholder
from flask.ext.admin.model.fields import InlineFieldList, AjaxSelectField from flask.ext.admin.model.fields import InlineFieldList, AjaxSelectField, AjaxSelectMultipleField
from flask.ext.admin.model.widgets import InlineFormWidget from flask.ext.admin.model.widgets import InlineFormWidget
from flask.ext.admin._compat import iteritems from flask.ext.admin._compat import iteritems
...@@ -102,6 +102,10 @@ class CustomModelConverter(orm.ModelConverter): ...@@ -102,6 +102,10 @@ class CustomModelConverter(orm.ModelConverter):
raise ValueError('ListField "%s" must have field specified for model %s' % (field.name, model)) raise ValueError('ListField "%s" must have field specified for model %s' % (field.name, model))
if isinstance(field.field, ReferenceField): if isinstance(field.field, ReferenceField):
loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name)
if loader:
return AjaxSelectMultipleField(loader, **kwargs)
kwargs['widget'] = form.Select2Widget(multiple=True) kwargs['widget'] = form.Select2Widget(multiple=True)
# TODO: Support AJAX multi-select # TODO: Support AJAX multi-select
......
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