Limitar las opciones con el menú desplegable en matraz-admin

Mi modelo SQLAlchemy tiene un campo String que me gustaría limitar a algunas opciones.

Me pregunto cómo podría crear un menú desplegable para este campo en la interfaz de Flask-Admin que aseguraría que la db solo se rellene con una de mis opciones. Si permito que el usuario ingrese estos campos manualmente, pueden deletrearlos incorrectamente, etc.

enum , form_choices y form_args

Su pregunta es sobre la restricción de valores en el nivel de formulario, pero también podemos analizarlo brevemente en el nivel de esquema.

A. Restricción de valores en el nivel de la base de datos: campos de enum

Para limitar el rango de valores permitidos, lo primero que debe considerar es si le gustaría que la base de datos lo haga cumplir por usted. La mayoría de las bases de datos tienen un campo de tipo de enum que le permite restringir un campo a un conjunto de valores ( MySQL , PostGres ). Este enfoque tiene sus pros y sus contras. Entre los contras, los valores pueden no aparecer en el orden que espera; y cada vez que desee introducir nuevos valores al conjunto, debe modificar la base de datos.

B. Restricción de valores con form_choices desplegables: form_choices

Para crear menús desplegables que presenten un conjunto de valores permitidos, cree un ModelView personalizado y defina su rango de valores en form_choices . Por ejemplo:

 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) 

En form_choices , ha creado form_choices desplegables para dos campos: now_showing y color . El primer campo admite los valores 0 y 1 , pero para que sea más fácil para los ojos, el formulario mostrará No se muestra para 0 y Se muestra para 1 .

Tenga en cuenta que esto funcionará en una forma regular, pero no en una forma en línea .

Deberá agregar el ModelView a la aplicación: algo como

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

C. Validación: form_args

En las formas en línea, es posible que no tenga el menú desplegable. Pero puede seguir refinando su ModelView personalizado definiendo los validadores WTF para varios campos.

Como hicimos con form_choices , puede definir un diccionario form_args contenga una lista de validators . Por ejemplo:

 # 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'])] } } 

Hay muchos validadores predefinidos, y usted puede definir los suyos propios: consulte la introducción del flask-administrador y la sección de validadores de la documentación de WTF .