【发布时间】:2014-04-14 02:48:01
【问题描述】:
这里有很多关于 SO 的问题,其标题听起来与我将要描述的内容相似,但据我从字面上数小时的研究中可以看出,这个问题是独一无二的。就这样吧!
我正在编写我的第一个 Flask 应用程序。我使用 SQLAlchemy 作为模型层,使用 WTForms 来处理表单。该应用程序将成为一个轻量级的个人理财经理,我可能不会真正将其用于严肃的业务。我有一张表用于列出所有交易,另一张用于所有费用类别(杂货、服装等)。事务表有一个引用类别表的列(“类别”)。在视图中,我用一个元素表示类别列表。
我的问题是,在编辑事务时,我不知道如何告诉 WTForms 将元素设置为特定的预定义值。 (是的,我知道你可以在定义表单的时候设置一个默认值,这不是我要问的。)
模型看起来像这样(删除了不相关的字段):
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False, unique=True)
# ...
class Trans(db.Model):
# ...
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('trans', lazy='dynamic'))
# ...
forms.py:
def category_choices():
return [('0', '')] + [(c.id, c.name) for c in Category.query.all()]
class TransactionForm(Form):
# ...
category = SelectField('Category', coerce=int, validators=[InputRequired()])
# ...
路由(POST尚未实现):
@app.route('/transactions/edit/<trans_id>', methods=['GET', 'POST'])
def trans_edit(trans_id):
transaction = Trans.query.get(trans_id)
form = forms.TransactionForm(obj=transaction)
form.category.choices = forms.category_choices()
form.category.default = str(transaction.category.id)
#raise Exception # for debugging
return render_template('trans.html',
title='Edit Transaction',
form=form)
最后是模板(Jinja2):
{{ form.category(class='trans-category input-medium') }}
正如您在路由中看到的,我从 transaction.category.id 设置了 form.category.default,但这不起作用。我认为我的问题是我在创建表单后设置“默认”。我不得不这样做,因为模型通过 SQLAlchemy 来自数据库。根本原因似乎是 form.category 是一个对象(由于关系),WTForms 似乎无法轻松处理。我不可能是第一个遇到这种情况的人……我是否需要重新设计模型以与 WTForms 更加兼容?我有哪些选择?
谢谢!
【问题讨论】:
-
是的,我正在处理similar issue。如何将关系的值传递给字段。你找到答案了吗?不过,在您的情况下,您似乎可以使用 SQLAlchemy WTForm 扩展,它将在下拉列表中显示类别值。你试过了吗?
标签: python sqlalchemy flask wtforms