Проверка формы с помощью WTForms и автозаполнение модели SQLAlchemy данными формы в Flask

У меня есть форма, которую я должен проверить, а затем сохранить данные в базе данных. У меня есть модель SQLAlchemy под названием Campaign, которая выглядит примерно так

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()
class Campaign(db.Model):
    __tablename__ = 'campaigns'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    priority = db.Column(db.SmallInteger)
    starts_at = db.Column(db.Date)
    ends_at = db.Column(db.Date)
    .... bla bla bla

Теперь у меня есть форма WTForm для проверки, подобная этой

from flask.ext.wtf import Form, TextField, IntegerField, DateField, Required, NumberRange
class CampaignForm(Form):

    def date_validation(form, field):
        #some validation on date

    name = TextField(validators=[Required()])
    priority = IntegerField(validators=[Required(), NumberRange(min=1,max=100)])
    start_date = DateField(validators=[Required(), date_validation])
    end_date = DateField(validators=[Required(), date_validation])
    ... bla bla bla

Теперь, чтобы проверить и сохранить данные формы, я могу сделать что-то вроде этого, это мой view

code in Flask

class CampaignsView(MethodView):
    def post(self):
        """
        For creating a new campaign
        """
        form = CampaignForm(request.form)
        if form.validate():
            campaign = Campaign(form.name.data, form.priority.data, and so on )
            session.add(campaign)

Теперь приведенный выше код глуп, потому что мне нужно жестко закодировать каждое имя поля в представлении. Есть ли другой способ заполнить поля моей модели полями формы? Спасибо


person lovesh    schedule 23.01.2013    source источник


Ответы (3)


Вы можете использовать метод .populate_obj следующим образом:

if form.validate_on_submit():
    campaign = Campaign()
    form.populate_obj(campaign)

Также ознакомьтесь с документами по этому .

person Alexander Jung-Loddenkemper    schedule 23.01.2013
comment
Замечательно. И есть ли способ избежать создания одного и того же логического класса один раз для формы и один раз для базы данных? Можно ли создать один класс для обоих? - person famargar; 16.01.2017
comment
@famargar не уверен, понимаю ли я твой вопрос? - person Alexander Jung-Loddenkemper; 19.01.2017

есть расширение wtforms для sqlalachemy:

также кое-что может вам помочь

из ссылок:

from flaskext.wtf import Form
from wtforms.ext.appengine.db import model_form
from models import MyModel

MyForm = model_form(MyModel, Form)
person Mohammad Efazati    schedule 23.01.2013
comment
В (этом)[flask.pocoo.org/snippets/60/] подход i должны пройти валидаторы в аргументе field_args аргумента model_form. Могу ли я использовать свой класс формы CampaignForm? - person lovesh; 23.01.2013
comment
@lovesh нет, вы можете расширить данные с помощью field_args. - person Mohammad Efazati; 23.01.2013

Вы также можете сделать что-то вроде этого:

if request.method == 'POST' and form.validate() == True:
    create new user

и отправить пользователя на нужную страницу

person Fon Desmond    schedule 23.06.2017