Колба с SQLAlchemy, сохраняющая большую форму (новичок) - PullRequest
0 голосов
/ 24 октября 2018

Я пишу много шаблонного кода, чтобы попытаться сохранить данные моей формы.В других языках мне не приходилось вручную связывать атрибут формы с моделью перед сохранением. Мне интересно, есть ли у python / flask аналогичный подход?В идеале я бы предпочел вручную сопоставить все мои поля формы, чтобы просто сохранить запись в БД.

[править] Чтобы было ясно, этот подход хорошо работает для меня, записи сохраняются должным образом, однако это кажется неэффективным.В другом фрагменте кода я смог использовать библиотеку wtf {{ wtf.quick_form(form) }} для создания формы в формате html без явного перечисления всех ее полей.Учитывая, что у меня есть те же имена для моих атрибутов модели, что и для атрибутов формы, мне было интересно, могу ли я сделать то же самое?[править]

Любой отзыв

Пример ниже ..

У меня большая модель "product"

class Product(db.Model):
    field1 = db.Column(db.String(200))
    field2 = db.Column(db.String(200))
    ....
    field30 = db.Column(db.String(200))

Она представлена ​​в виде колбынапример,

class ProductForm(FlaskForm):
   field1 = StringField('Field 1', validators=[DataRequired()])
   field2 = TextAreaField('Field 2 Label')
   field30 = TextAreaField('Field 30 Label')
   submit = SubmitField('Submit')

Здесь я пытаюсь отобразить и сохранить запись о продукте ...

def save_product(self, product, form):
    product.field1 = form.field.data
    #lots more tedious form to model mapping
    db.session.add(product)
    # commit the data to the database
    db.session.commit()

В моем маршрутах. у меня есть следующее.Я вижу, как это называется, и запись действительно сохраняется.

def crud():
    form = CrudForm()
    if form.validate_on_submit():
        product = Product()
        product.save_product(product, form, new=True)
        flash(_('Product Saved'))
        return redirect(url_for('main.index'))

    return render_template('crud.html', title=_('Product CRUD'),
                           form=form)

1 Ответ

0 голосов
/ 25 октября 2018

Учитывая, что имена полей вашей формы совпадают с именами столбцов вашей базы данных, можно сократить шаблон.Указание всех полей в вашей форме доступно как свойство form.data, и его можно передавать напрямую через аргументы ключевых слов, когда вы создаете новый экземпляр вашей модели, а не устанавливаете их по одному впоследствии.

product = Product(**form.data)
...