MongoEngine/flask-mongoengine

View on GitHub
docs/wtf_forms.md

Summary

Maintainability
Test Coverage
# MongoEngine and WTForms

flask-mongoengine automatically generates WTForms from MongoEngine models:

```python
from flask_mongoengine.wtf import model_form

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)

class Content(db.EmbeddedDocument):
    text = db.StringField()
    lang = db.StringField(max_length=3)

class Post(db.Document):
    title = db.StringField(max_length=120, required=True, validators=[validators.InputRequired(message='Missing title.'),])
    author = db.ReferenceField(User)
    tags = db.ListField(db.StringField(max_length=30))
    content = db.EmbeddedDocumentField(Content)

PostForm = model_form(Post)

def add_post(request):
    form = PostForm(request.POST)
    if request.method == 'POST' and form.validate():
        # do something
        redirect('done')
    return render_template('add_post.html', form=form)
```

For each MongoEngine field, the most appropriate WTForm field is used.
Parameters allow the user to provide hints if the conversion is not implicit::

```python
PostForm = model_form(Post, field_args={'title': {'textarea': True}})
```

Supported parameters:

For fields with `choices`:

- `multiple` to use a SelectMultipleField
- `radio` to use a RadioField

For ``StringField``:

- `password` to use a PasswordField
- `textarea` to use a TextAreaField

For ``ListField``:

- `min_entries` to set the minimal number of entries

(By default, a StringField is converted into a TextAreaField if and only if it has no
max_length.)

## Supported fields

* StringField
* BinaryField
* URLField
* EmailField
* IntField
* FloatField
* DecimalField
* BooleanField
* DateTimeField
* **ListField** (using wtforms.fields.FieldList )
* SortedListField (duplicate ListField)
* **EmbeddedDocumentField** (using wtforms.fields.FormField and generating inline Form)
* **ReferenceField** (using wtforms.fields.SelectFieldBase with options loaded from
  QuerySet or Document)
* DictField

## Not currently supported field types:

* ObjectIdField
* GeoLocationField
* GenericReferenceField