Повторное использование Flask-Admin

Flask-Admin это прекрасный модуль который можно использовать для управления имеющимися моделями. Обычно он представляет административную часть сайта и доступ к нему ограничен. Но этот модуль слишком хорош и содержит слишком много хороших решений чтобы не использовать его возможности для разработки.

Например, у меня снова возникла задача представить ограниченный интерфейс к некоторой части модели. Можно было написать отдельную обёртку для Admin но тогда пришлось бы добавлять её в панель управления, а этой задачи не было. Либо можно было написать новый блюпринт, новую форму, но тогда пришлось бы делать сложный виджет для связи many2many и вообще делать то, что прекрасно работает в уже использумом рядом Flask-Admin. По-этому наиболее эффективным будет повторно использовать часть библиотеки Flask-Admin.

И так, задача: реализовать сложное представление с помощью blueprint и сложную форму с поддержкой Ajax. У меня есть модель "заявки" и связанные many2many  с ней модель "исполнитель". На форме редактирования заявки должен быть виджет управления связанных с заявкой исполнителей. Во Flask-Admin есть прекрасный виджет AjaxSelectMultipleField, с помощью которого форма через Ajax запрос обращается к базе и отрисовывает выпадающий список и связанные записи в виде тегов с возможностью удаления. Вот так его можно использовать в собственных формах

from flask_admin.model.fields import  AjaxSelectMultipleField
from flask.ext.admin.contrib.sqla.ajax import QueryAjaxModelLoader

 

class RequisitionEditForm(Form):

    personal =         AjaxSelectMultipleField(
                            QueryAjaxModelLoader('personal', db.session, Personal, fields=['fio']) ,
                            u'Исполнители'
                        )

тут я включаю в форму поле personal как объект класс AjaxSelectMultipleField, которой расширяется с помощью объекта класс QueryAjaxModelLoader.

Затем в шаблон страницы (предполагается что вы используете Flask-Bootstrap) необходимо добавить

{% import 'admin/lib.html' as lib with context %}
{% import 'admin/static.html' as admin_static with context %}

затем добавить стили админки в блок styles

 {{ lib.form_css() }}

ну и под конец добавить JS скрипты с библиотекой select2  в конец блока scripts

{{ lib.form_js() }}
<script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.9.0') }}" type="text/javascript"></script>
<script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}" type="text/javascript"></script>

После это виджет ещё НЕ появится, потому что объекты Flask.admin работают в рамках класса и блюпринта создавшего его, и объект AjaxSelectMultipleField не сможет разрешить имя по которому ему нужно обращаться с Ajax запросами. По-этому, необходимо помочь ему и создать свой Ajax обработчик (можно и без MethodView)

def ajax_lookup():
    limit = int(request.args.get('limit', 10))
    offset = int(request.args.get('offset', 0))
    if request.args.get('name') == 'personal':
        query = Personal.query.filter(Personal.fio.like(u'%%%s%%' % request.args.get('query')))
        data = [ [d.id, d.fio ] for d in query.offset(offset).limit(limit)]
        return Response( json.dumps(data),  mimetype='application/json')
    return jsonify([])

а затем подключаем Ajax обработчк в Blueprint

module.add_url_rule('ajax_lookup',  view_func=ajax_lookup, methods=['GET',])

Всё, вот так, дёшево и сердито можно использовать код прекрасного фреймворка и получаем вот такую красивую и функциональную формочку

 

Комментариев 0
Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут

Твори з мови: https://fable.in.ua/.
HEYmedia настроит эффективный таргет в телеграм