Flask Admin — отличный модуль, который позволяет вам управлять существующими мокапами. Обычно он представляет собой административную часть сайта и доступ к нему ограничен. Но этот модуль слишком хорош и содержит слишком много хороших решений, чтобы не использовать его возможности для разработки..
Например, у меня снова была задача отобразить ограниченный интерфейс к части модели. Можно было написать отдельную обертку для админки, но тогда пришлось бы добавить ее в панель управления, а этой задачи не было. Или можно было написать новый блюпринт, новую форму, но тогда пришлось бы создавать сложный виджет подключения Many2Many и вообще делать то, что отлично работает в уже используемой админке Flask. Поэтому наиболее эффективным способом является повторное использование части административной библиотеки Flask.
И так задача: реализовать сложное представление с помощью Blueprint и сложную форму с поддержкой Ajax. У меня есть модель «Bid» и связанная модель «Executor» с Many2many. Форма редактирования приложения должна иметь виджет для управления исполнителями, подключенными к приложению. Flask-Admin имеет приятный виджет AjaxSelectMultipleField, который позволяет форме получать доступ к базе данных через запрос ajax и отображать раскрывающийся список и связанные сообщения в виде удаляемых тегов. Таким образом, вы можете использовать его в своих собственных формах
из импорта flask_admin.model.fields AjaxSelectMultipleField
из импорта flask.ext.admin.contrib.sqla.ajax QueryAjaxModelLoader
Класс РеквизицияРедактироватьФорму(Форма):
личный = AjaxSelectMultipleField(
QueryAjaxModelLoader («личный», db.session, личный, поля =[‘fio’]),
ты актер
)
Здесь я включаю личное поле как объект класса AjaxSelectMultipleField в форму, которая расширяется с помощью объекта класса QueryAjaxModelLoader.
Затем вам нужно добавить шаблон страницы (при условии, что вы используете Flask-Bootstrap).
{% import ‘admin/lib.html’ как lib с контекстом %}
{% import ‘admin/static.html’ как admin_static с контекстом %}
Затем добавьте стили администратора в блок стилей.
{{ lib.form_css() }}
Ну и в конце добавляем JS скрипты с помощью библиотеки select2 в конце блока скрипта
{{ lib.form_js() }}
После этого виджет еще НЕ будет отображаться, потому что объекты Flask.admin будут работать внутри класса и схемы, которые его создали, а объект AjaxSelectMultipleField не сможет разрешить имя, которое он запрашивает ajax, для которого должен обрабатываться. Так что вам нужно помочь ему и создать свой собственный обработчик Ajax (это возможно без MethodView).
определить ajax_lookup():
лимит = int(request.args.get(‘limit’, 10))
смещение = int(request.args.get(‘смещение’, 0))
если request.args.get(‘имя’) == ‘личное’:
запрос = Personal.query.filter(Personal.fio.like(u’%%%s%%’ % request.args.get(‘query’)))
данные = [ [d.id, d.fio ] для d в query.offset(offset).limit(limit)]
вернуть ответ (json.dumps (данные), mimetype = ‘application/json’)
jsonify (возврат[])
а затем подключаем обработчик ajax к блупринту
module.add_url_rule(‘ajax_lookup’, view_func=ajax_lookup, метод=[‘GET’,])
Все так, дешево и сердито, можно использовать код замечательного фреймворка и получить красивую и функциональную форму