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.
Выбор «A» изначально использовался, хотя он создает множество кошмаров (как вы упомянули). Поэтому я изменил его на поле строки и ограничил записи в контроллерах. –
Да, есть время и место для 'enum'. Хранение меньше с 'enum' (только одна копия значения), но поиск/объединение может быть более медленным (обсуждается на стр.123-124 из * High-Performance MySQL *, 3-е изд. Это хороший вопрос, надеюсь, что это будет Будьте полезны другим. :) – zx81
Кстати, кажется, что [ошибка с полями 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