如何在表单中放入数据(id)并在提交时获取

1 投票
1 回答
4100 浏览
提问于 2025-04-18 03:58

我刚接触wtforms,所以非常感谢任何帮助。

我需要显示书名,并在每个书名旁边放一个“删除”按钮。我看过wtforms的快速入门,但我还是不知道怎么用它来解决我的问题。

所以我决定换个方法——我最好的想法是把一个包含书籍ID和名称的字典渲染到模板中,然后在提交时返回ID,但我还是做不到。下面是代码示例。

这是view.py

@application.route('/delete', methods=['GET', 'POST'])
def delete():
    books_lib = mydatabase.get_all_books()
    form = DeleteForm(request.form)
    if request.method == 'POST':
        delete_id = form.id.data
        mydatabase.del_book(delete_id)
        return render_template('delete.html', form = form, books_lib = books_lib)
    return render_template('delete.html', form = form, books_lib = books_lib)

这是模板

<!DOCTYPE html>
<html>
<body>
    <h2>book to delete</h2>
<form action="/delete" name="delete" method="POST">
    {% if books_lib %}
        {% for id, book in books_lib.items() %}
            <p>{{book}}:<input type="submit" value="Delete" id="{{id}}">
        {% endfor%}
    {% endif %}
</form>
</body>
</html>

这是表单

class DeleteForm(Form):
     book = TextField("Book name", [validators.Length(min=2, max=25)])
     id = HiddenField("id")

1 个回答

2

这是我处理这个问题的方法。

模板

<p><a href="{{ url_for('delete_post', url=post.url) }}">delete</a></p>

视图

# delete a post
@app.route('/<path:url>/d')
@login_required
def delete_post(url):
    post = Post.get_post(url)
    if post is None:
        flash('post not found')
        return redirect(url_for('home'))
    db.session.delete(post)
    db.session.commit()
    Topic.update_counts()
    flash('Your post has been deleted')
    return redirect(url_for('index'))

url_for是Flask中的一个函数,它可以生成一个网址,并把它和某个功能绑定在一起。

简单来说就是……

  1. 模板使用url_for函数生成删除的路径。
  2. 当你访问这个页面时,删除功能就会被调用。
  3. 然后会有一个消息闪现到模板上,告诉你删除完成了。

关于你最初的问题……

如果你只是想把一串ID传给你的模板……

首先,创建一个显示功能。

@app.route('/index')
def index():
    posts = Post.query.order_by(Post.pub_date.desc())  #SQLAlchemy query.
    return render_template('index.html', posts=posts) #sends all posts to template.

现在在你的模板中,你可以生成一个post.ids的列表。

    {% for post in posts %}
        {{post.id})
    {% endfor %}

要在列表中的每个项目旁边添加一个删除链接,可以使用url_for。

{% for post in posts %}    
<p>{{post.id}) <a href="{{ url_for('delete_post', id=post.id) }}">delete</a></p>
{% endfor %}

在这种情况下,我使用post的ID来识别我想删除的特定帖子,所以不要忘记在你的删除功能中修改@app.route。

@app.route('/<int:id>/delete')

注意,这个解决方案不需要表单。只有当你想用复选框进行批量删除时,才需要表单。

撰写回答