我用烧瓶做了一个网络应用
简而言之:当我们提交一个使用QuerySelectField+sqlalchemy query填充选择框的表单时,提交的实际值似乎是主键,但是如果我需要提交另一个值怎么办?假设一个表有两列,ID和Item,现在ID是主键,但是用户不是按主键ID而是按项选择行,这是他们看到的项名称,而不是主键ID。但是表单提交了ID,我不想提交项目名称
我发现这很难解释,所以这里有一个很长的版本
详细解释
我有一个模型使表nutrionalvalues有两列,id是主键,item列保存食物类型的名称
class nutritionalvalues(db.Model):
id = db.Column(db.Integer, primary_key=True)
item = db.Column(db.String(200), nullable=False)
def __repr__(self):
return '{}'.format(self.item)
现在用的是炼金术和烧瓶
def choice_query():
return nutritionalvalues.query
class ChoiceForm(FlaskForm):
item = QuerySelectField(query_factory=choice_query, allow_blank=False)
我做了一个“ChoiceForm”类,用这个来做一个表单
form = ChoiceForm()
return render_template('index.html', form=form)
在index.html模板中,我有标记
<form action="/" method="POST">
{{ form.csrf_token }}
{{ form.item }}
<input type="submit" value="Add Item">
</form>
呈现时,浏览器会生成html代码
<form action="/" method="POST">
<select id="item" name="item">
<option value="1"><nutritionalvalues 1></option>
<option value="2"><nutritionalvalues 2></option>
<option value="3"><nutritionalvalues 3></option>
</select>
<input type="submit" value="Add Item">
</form>
现在假设我使用'get\u label'参数,我可以将select选项更改为实际项
class ChoiceForm(FlaskForm):
item = QuerySelectField(query_factory=choice_query, allow_blank=False, get_label='item')
所以html呈现如下
<form action="/" method="POST">
<select id="item" name="item">
<option value="1">bread</option>
<option value="2">salmon</option>
<option value="3">pork</option>
</select>
<input type="submit" value="Add Item">
</form>
但是在提交表单时,选择框返回'1'表示'bread',但我希望它返回'bread'
因为我用它把数据输入到另一个表中,如下所示
if request.method == 'POST':
food_item = request.form['item']
new_food = eaten(item=food_item)
try:
db.session.add(new_food)
db.session.commit()
return redirect('/')
我不想输入'1'作为我刚吃的食物,我想输入'bread'
那么,在提交表单时,如何使用QuerySelectField+sqlalchemy查询工具箱将实际的项目名称传回来呢
答案与您使用
get_label
所做的非常相似,其中get_label
要么接受字符串属性名,要么接受可调用的一个参数,对象将被传递到该参数以派生标签从documentation:
有些不一致的是,
get_pk
参数不接受字符串属性名,只接受一个可调用的参数,但本质上是一样的(传递给get_label
的字符串变成了一个可使用operator.attrgetter()
[source]调用的参数)。因此,您可以通过将可调用函数传递给get_pk
来控制用于标识所选选项的对象字段,例如,get_pk=operator.attrgetter("item")
,或者get_pk=lambda x: x.item
将为您保存导入如果您打算以这种方式使用
nutritionalvalues.item
,那么您可能需要对它设置一个唯一的约束,以确保在有人添加了一个名称已经存在的项时不会出现bug相关问题 更多 >
编程相关推荐