Python wtforms QuerySelectField:返回的不是主键条目

2024-05-16 14:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我用烧瓶做了一个网络应用

简而言之:当我们提交一个使用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">&lt;nutritionalvalues 1&gt;</option>
        <option value="2">&lt;nutritionalvalues 2&gt;</option>
        <option value="3">&lt;nutritionalvalues 3&gt;</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查询工具箱将实际的项目名称传回来呢


Tags: formid表单dbreturnvalueitemquery
1条回答
网友
1楼 · 发布于 2024-05-16 14:22:57

答案与您使用get_label所做的非常相似,其中get_label要么接受字符串属性名,要么接受可调用的一个参数,对象将被传递到该参数以派生标签

documentation

For the most part, the primary keys will be auto-detected from the model, alternately pass a one-argument callable to get_pk which can return a unique comparable key.

有些不一致的是,get_pk参数不接受字符串属性名,只接受一个可调用的参数,但本质上是一样的(传递给get_label的字符串变成了一个可使用operator.attrgetter()[source]调用的参数)。因此,您可以通过将可调用函数传递给get_pk来控制用于标识所选选项的对象字段,例如,get_pk=operator.attrgetter("item"),或者get_pk=lambda x: x.item将为您保存导入

如果您打算以这种方式使用nutritionalvalues.item,那么您可能需要对它设置一个唯一的约束,以确保在有人添加了一个名称已经存在的项时不会出现bug

相关问题 更多 >