如何将数据(id)放入表单(wtforms)并将其恢复提交

时间:2014-04-23 18:30:34

标签: python flask wtforms

我是wtforms的新手,所以我真的很感激任何帮助。

我需要显示书籍名称,并在每个附近放置“删除”按钮。我读过wtforms crash course,但我不知道如何解决我的问题。

所以我决定以其他方式做到这一点 - 我最好的想法是使用id和name以及提交返回id来呈现模板dict,但我仍然无法做到。代码示例如下。

它是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 个答案:

答案 0 :(得分:1)

我是这样做的。

<强> TEMPLATE

<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函数,它生成一个url并将其绑定到一个函数。

Soooo ....简而言之。

  1. template使用url_for函数生成删除路径。
  2. 访问页面时会调用删除功能。
  3. 消息闪烁到模板说删除完成。
  4. 回答你原来的问题......

    如果您只想将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而不是post.url来标识我要删除的特定帖子,所以不要忘记在删除功能中修改@ app.route。

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

    请注意,此解决方案不需要表单。如果您想使用复选框进行批量删除,则只需要一个表单。