Type specific conversion

Numeric type

WTForms-Alchemy automatically converts Numeric columns to DecimalFields. The converter is also smart enough to convert different decimal scales to appropriate HTML5 input step args.

class Account(Base):
    __tablename__ = 'event'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    balance = sa.Column(
        sa.Numeric(scale=2),
        nullable=False
    )

class AccountForm(ModelForm):
    class Meta:
        model = Account

Now rendering AccountForm.balance would return the following HTML:

<input type=’decimal’ required step=”0.01”>

Arrow type

WTForms-Alchemy supports the ArrowType of SQLAlchemy-Utils and converts it to HTML5 compatible DateTimeField of WTForms-Components.

from sqlalchemy_utils import ArrowType


class Event(Base):
    __tablename__ = 'event'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    start_time = sa.Column(
        ArrowType(),
        nullable=False
    )

class EventForm(ModelForm):
    class Meta:
        model = Event

Now the EventForm is essentially the same as:

class EventForm(Form):
    start_time = DateTimeField(validators=[DataRequired()])

Choice type

WTForms-Alchemy automatically converts sqlalchemy_utils.types.choice.ChoiceType to WTForms-Components SelectField.

from sqlalchemy_utils import ChoiceType


class Event(Base):
    __tablename__ = 'event'
    TYPES = [
        (u'party', u'Party'),
        (u'training, u'Training')
    ]

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    type = sa.Column(ChoiceType(TYPES))


class EventForm(ModelForm):
    class Meta:
        model = Event

Now the EventForm is essentially the same as:

from wtforms_alchemy.utils import choice_type_coerce_factory


class EventForm(Form):
    type = SelectField(
        choices=Event.TYPES,
        coerce=choice_type_coerce_factory(Event.type.type),
        validators=[DataRequired()]
    )

Color type

from sqlalchemy_utils import ColorType


class CustomView(Base):
    __tablename__ = 'view'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    background_color = sa.Column(
        ColorType(),
        nullable=False
    )

class CustomViewForm(ModelForm):
    class Meta:
        model = CustomView

Now the CustomViewForm is essentially the same as:

from wtforms_components import ColorField


class CustomViewForm(Form):
    color = ColorField(validators=[DataRequired()])

Country type

from sqlalchemy_utils import CountryType


class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    country = sa.Column(CountryType, nullable=False)


class UserForm(ModelForm):
    class Meta:
        model = User

The UserForm is essentially the same as:

from wtforms_components import CountryField


class UserForm(Form):
    country = CountryField(validators=[DataRequired()])

Email type

from sqlalchemy_utils import EmailType


class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    email = sa.Column(EmailType, nullable=False)


class UserForm(ModelForm):
    class Meta:
        model = User

The good old wtforms equivalent of this form would be:

from wtforms_components import EmailField


class UserForm(Form):
    email = EmailField(validators=[DataRequired()])

Password type

Consider the following model definition:

from sqlalchemy_utils import PasswordType


class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    name = sa.Column(sa.Unicode(100), nullable=False)
    password = sa.Column(
        PasswordType(
            schemes=['pbkdf2_sha512']
        ),
        nullable=False
    )

class UserForm(ModelForm):
    class Meta:
        model = User

Now the UserForm is essentially the same as:

class UserForm(Form):
    name = TextField(validators=[DataRequired(), Length(max=100)])
    password = PasswordField(validators=[DataRequired()])

Phonenumber type

WTForms-Alchemy supports the PhoneNumberType of SQLAlchemy-Utils and converts it automatically to WTForms-Components PhoneNumberField. This field renders itself as HTML5 compatible phonenumber input.

Consider the following model definition:

from sqlalchemy_utils import PhoneNumberType


class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    name = sa.Column(sa.Unicode(100), nullable=False)
    phone_number = sa.Column(PhoneNumberType())


class UserForm(ModelForm):
    class Meta:
        model = User

Now the UserForm is essentially the same as:

from wtforms_components import PhoneNumberField


class UserForm(Form):
    name = TextField(validators=[DataRequired(), Length(max=100)])
    password = PhoneNumberField(validators=[DataRequired()])

URL type

WTForms-Alchemy automatically converts SQLAlchemy-Utils URLType to StringField and adds URL validator for it.

Consider the following model definition:

from sqlalchemy_utils import URLType


class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    website = sa.Column(URLType())


class UserForm(ModelForm):
    class Meta:
        model = User

Now the UserForm is essentially the same as:

from wtforms_components import StringField
from wtforms.validators import URL


class UserForm(Form):
    website = StringField(validators=[URL()])