2015-08-19 1 views
5

В моей модели SQLAlchemy есть поле String, которое я хотел бы ограничить несколькими вариантами.ограничение выбора с выпадающим списком в flask-admin

Мне интересно, как я смогу создать выпадающее меню для этого поля в интерфейсе Flask-Admin, который обеспечит, чтобы db был заполнен одним из моих вариантов. Если я позволить пользователю вручную вводить эти поля, они могут означать их неправильно и т.д.

ответ

15

enum, form_choices и form_args

Ваш вопрос об ограничении значений на уровне формы, но мы также можем кратко обсудить его на уровень схемы.

A. Ограничение значения на уровне базы данных: enum поля

Чтобы ограничить диапазон допустимых значений, то первое, что нужно рассмотреть, можете ли вы, как база данных для обеспечения, что для вас. В большинстве баз данных есть поле типа enum, которое позволяет ограничить поле набором значений (MySQL, PostGres). Этот подход имеет свои плюсы и минусы. Среди минусов значения могут не отображаться в ожидаемом порядке; и каждый раз, когда вы хотите ввести новые значения в набор, вам нужно изменить базу данных.

B. Ограничительные значения с раскрывающимися: form_choices

Для создания раскрывающегося меню, которые представляют собой набор допустимых значений, создавать пользовательский видовые и определить диапазон значений в form_choices. Например:

class FilmAdmin(sqla.ModelView): 

    form_choices = { 'now_showing': [ ('0', 'Not Showing'), ('1', 'Showing')], 
        'color': [('bw', 'Black & White'), ('color', 'Color')] 
        } 

    # (many other customizations can go here) 

В form_choices, вы создали раскрывающиеся меню для двух полей: now_showing и color. Первое поле допускает значения 0 и 1, но, чтобы сделать его легче на глазах форма покажет не показаны для 0 и Показаны для 1.

Обратите внимание, что это будет работать в обычном формате, но не в встроенной форме.

Вам нужно будет добавить видовую к приложению: что-то вроде

admin.add_view(FilmAdmin(yourmodels.Film, db.session))

C. Проверка: form_args

В встроенных форм, вы не можете иметь раскрывающийся. Но вы можете продолжать совершенствовать свой собственный ModelView, определяя валидаторы WTF для различных полей.

Как и в случае с form_choices, вы можете указать словарь form_args, содержащий список validators. Например:

# first import the `AnyOf` validator: 
from wtforms.validators import AnyOf 

class FilmAdmin(sqla.ModelView): 

    # column_exclude_list = ... 
    # form_excluded_columns = ... 
    # form_choices = ... 

    form_args = { 
     'flavors': { 
      'validators': [AnyOf(['strawberry', 'chocolate'])] 
     } 
    } 

Есть много предопределенных валидаторов, и вы можете определить свой собственный: пожалуйста, обратитесь к flask-admin introduction и к validators section of the WTF documentation.

+0

Выбор «A» изначально использовался, хотя он создает множество кошмаров (как вы упомянули). Поэтому я изменил его на поле строки и ограничил записи в контроллерах. –

+0

Да, есть время и место для 'enum'. Хранение меньше с 'enum' (только одна копия значения), но поиск/объединение может быть более медленным (обсуждается на стр.123-124 из * High-Performance MySQL *, 3-е изд. Это хороший вопрос, надеюсь, что это будет Будьте полезны другим. :) – zx81

+0

Кстати, кажется, что [ошибка с полями enum' в flask-admin] (https://github.com/flask-admin/flask-admin/issues/1003), который может быть то, что вы испытывали. На данный момент у flask-admin, похоже, много [нерешенных проблем, которые не столь незначительны] (https://github.com/flask-admin/flask-admin/issues) (см. Статью «Безопасность» № 1000 и другие) , Вы думаете, что к 2015 году проблема создания админ-интерфейсов будет решена, но совсем не будет. Я не нашел серебряную пулю, не тратя время на то, чтобы закодировать все это вручную, что также позволяет мне избежать ужасно неэффективного ORM – zx81