Simple and extensible admin interface framework for Flask
86
Quality
Pending
Does it follow best practices?
Impact
86%
1.30xAverage score across 10 eval scenarios
Advanced form system with custom field types, validation, widgets, and CSRF protection for Flask-Admin interfaces.
Foundation form classes providing translation support and CSRF protection.
class BaseForm:
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
"""
Base form class with translation support.
Args:
formdata: Input data for form
obj: Object to populate form from
prefix (str): Field name prefix
**kwargs: Additional form arguments
"""
class SecureForm(BaseForm):
"""
Form with CSRF protection enabled.
Automatically includes and validates CSRF tokens.
"""Enhanced field types for common admin interface requirements.
class DateTimeField:
def __init__(
self,
label=None,
validators=None,
format=None,
**kwargs
):
"""
Enhanced datetime field with picker widget.
Args:
label (str, optional): Field label
validators (list, optional): Field validators
format (str, optional): Date/time format string
**kwargs: Additional field arguments
"""
class TimeField:
def __init__(
self,
label=None,
validators=None,
formats=None,
default_format=None,
widget_format=None,
**kwargs
):
"""
Time field with multiple format support.
Args:
label (str, optional): Field label
validators (list, optional): Field validators
formats (list, optional): Accepted time formats
default_format (str, optional): Default format for parsing
widget_format (str, optional): Format for widget display
**kwargs: Additional field arguments
"""
class Select2Field:
def __init__(
self,
label=None,
validators=None,
coerce=None,
choices=None,
allow_blank=False,
blank_text=None,
**kwargs
):
"""
Select2 styled select field with enhanced UI.
Args:
label (str, optional): Field label
validators (list, optional): Field validators
coerce (function, optional): Value coercion function
choices (list, optional): Available choices
allow_blank (bool): Allow empty selection
blank_text (str, optional): Text for blank option
**kwargs: Additional field arguments
"""
class Select2TagsField:
def __init__(
self,
label=None,
validators=None,
save_as_list=False,
coerce=None,
allow_duplicates=False,
**kwargs
):
"""
Select2 tags field for multi-value input.
Args:
label (str, optional): Field label
validators (list, optional): Field validators
save_as_list (bool): Save as list instead of string
coerce (function, optional): Value coercion function
allow_duplicates (bool): Allow duplicate tags
**kwargs: Additional field arguments
"""
class JSONField:
"""
JSON data field with validation and pretty formatting.
Inherits from TextAreaField with JSON-specific processing.
"""Custom validators for Flask-Admin form fields.
class FieldListInputRequired:
"""
Validator for FieldList to ensure at least one item is present.
"""
def __init__(self, message=None):
"""
Initialize validator.
Args:
message (str, optional): Custom validation error message
"""
def __call__(self, form, field):
"""
Validate field has at least one entry.
Args:
form: Form instance
field: Field being validated
Raises:
ValidationError: If field is empty
"""Utility classes and functions for form management and configuration.
class FormOpts:
"""
Form options container for configuration.
"""
def recreate_field(unbound):
"""
Recreate UnboundField instance.
Args:
unbound: UnboundField to recreate
Returns:
UnboundField: New field instance
"""from flask_admin.form import BaseForm, SecureForm
from flask_admin.form.fields import Select2Field, JSONField
from wtforms import StringField, TextAreaField, BooleanField
from wtforms.validators import DataRequired, Email, Length
class UserForm(SecureForm):
name = StringField('Full Name', validators=[
DataRequired(),
Length(min=2, max=100)
])
email = StringField('Email Address', validators=[
DataRequired(),
Email()
])
role = Select2Field('Role', choices=[
('admin', 'Administrator'),
('user', 'Regular User'),
('guest', 'Guest User')
], coerce=str)
is_active = BooleanField('Active User')
preferences = JSONField('User Preferences', description='JSON configuration data')
bio = TextAreaField('Biography', description='User biography and notes')
# Use in model view
class UserModelView(ModelView):
form = UserForm
form_args = {
'name': {'render_kw': {'placeholder': 'Enter full name'}},
'email': {'render_kw': {'placeholder': 'user@example.com'}}
}from flask_admin.form.fields import DateTimeField, TimeField, Select2TagsField
from datetime import datetime
class EventForm(SecureForm):
title = StringField('Event Title', validators=[DataRequired()])
start_time = DateTimeField(
'Start Time',
format='%Y-%m-%d %H:%M',
default=datetime.now
)
duration = TimeField(
'Duration',
formats=['%H:%M', '%H:%M:%S'],
default_format='%H:%M'
)
tags = Select2TagsField(
'Tags',
save_as_list=True,
coerce=str,
description='Enter tags separated by commas'
)
location = Select2Field(
'Location',
choices=[], # Will be populated dynamically
allow_blank=True,
blank_text='Select a location...'
)
class EventModelView(ModelView):
form = EventForm
def create_form(self, obj=None):
form = super().create_form(obj)
# Populate location choices dynamically
form.location.choices = [
(loc.id, loc.name) for loc in Location.query.all()
]
return form
def edit_form(self, obj=None):
form = super().edit_form(obj)
# Populate location choices dynamically
form.location.choices = [
(loc.id, loc.name) for loc in Location.query.all()
]
return formclass ProductModelView(ModelView):
form_widget_args = {
'name': {
'placeholder': 'Product name',
'class': 'form-control-lg'
},
'description': {
'rows': 5,
'placeholder': 'Detailed product description...'
},
'price': {
'step': '0.01',
'min': '0',
'placeholder': '0.00'
},
'category': {
'data-placeholder': 'Choose category...',
'class': 'select2-enhanced'
}
}
form_args = {
'price': {
'validators': [DataRequired(), NumberRange(min=0)]
},
'name': {
'validators': [DataRequired(), Length(max=200)]
}
}from wtforms import SelectField, TextAreaField
from flask_admin.form.fields import Select2Field
class ArticleModelView(ModelView):
form_overrides = {
'status': Select2Field, # Use Select2 instead of regular select
'content': TextAreaField # Use textarea for content field
}
form_args = {
'status': {
'choices': [
('draft', 'Draft'),
('published', 'Published'),
('archived', 'Archived')
],
'coerce': str
},
'content': {
'render_kw': {
'rows': 10,
'class': 'editor'
}
}
}class ConfigModelView(ModelView):
form_overrides = {
'settings': JSONField
}
form_args = {
'settings': {
'description': 'Configuration in JSON format',
'render_kw': {
'rows': 8,
'placeholder': '{\n "key": "value"\n}'
}
}
}
def on_model_change(self, form, model, is_created):
# Validate JSON before saving
try:
if model.settings:
import json
json.loads(model.settings)
except ValueError as e:
raise ValidationError(f'Invalid JSON: {e}')Install with Tessl CLI
npx tessl i tessl/pypi-flask-admindocs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10