【问题标题】:Python Flask-WTF - use same form template for add and edit operationsPython Flask-WTF - 使用相同的表单模板进行添加和编辑操作
【发布时间】:2013-05-21 02:48:39
【问题描述】:

我刚刚开始使用 Flask / Flask-WTF / SQLAlchemy,我看到的大多数示例 CRUD 代码都显示了用于添加/编辑的单独模板。拥有两个具有几乎相同表单 html 的模板(例如 books_add.html、books_edit.html)似乎是重复的。从概念上讲,对我来说,拥有一个模板更有意义,比如“books_form.html”,然后从两个单独的路由定义中调用同一个模板上的 render_template。我不太确定如何完成它,例如:

@app.route('/books/add')
def add_book():
...
render_template('books_form.html', action = 'add')


@app.route('/books/edit/<id>')
def edit_book(id):
...
render_template('books_form.html', action = 'edit', id = id)

但我不确定我是否走在正确的轨道上,或者是否偏离了最佳实践。任何输入都值得赞赏 - 关于如何处理单个模板文件以处理添加或编辑行为的具体想法。也欢迎提供示例链接。

谢谢!

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    我尝试解决此问题的最简单方法是不在表单 (BookForm) 中包含 SubmitField。我们可以将表单提交值作为变量传递给表单,例如 edit_book 路由中的submit='Update'submit='Add Book'

    在路由中,如果 post 方法是 'GET',则使用与书籍相关的详细信息填充字段

    【讨论】:

      【解决方案2】:

      绝对没有理由使用单独的模板来添加/编辑不同类型的事物。考虑:

      {# data.html #}
      <!-- ... snip ... -->
      {% block form %}
      <section>
      <h1>{{ action }} {{ data_type }}</h1>
      <form action="{{ form_action }}" method="{{ method | d("POST") }}">
      {% render_form(form) %}
      </form>
      </section>
      {% endblock form %}
      

      忽略宏 render_form 有效(在 WTForms 的文档中有一个示例)——它只接受一个 WTForms 类型的对象并将表单呈现在无序列表中。然后你可以这样做:

      @app.route("/books/")
      def add_book():
          form = BookForm()
          # ... snip ...
          return render_template("data.html", action="Add", data_type="a book", form=form)
      
      @app.route("/books/<int:book_id>")
      def edit_book(book_id):
          book = lookup_book_by_id(book_id)
          form = BookForm(obj=book)
          # ... snip ...
          return render_template("data.html", data_type=book.title, action="Edit", form=form)
      

      但您不必将自己局限于书籍:

      @app.route("/a-resource/")
      def add_resource():
          # ... snip ...
          return render_template("data.html", data_type="a resource" ...)
      
      # ... etc. ...
      

      【讨论】:

      • 谢谢!我不确定我是否理解对 render_form 的引用 - 我返回 WTForms 文档和快速入门,但找不到它。我无法让它在我的代码中工作。我知道你要去哪里 - 你对表单模板的抽象程度比我想象的还要多,我喜欢。或许你能详细说明那篇文章?
      • 您可以使用 jinja 宏来呈现您的表单。请参阅this gist - 您将看到的大部分代码都不是我的。 render 函数只是一个非常通用的表单渲染器。就像 Sean 指出的那样,如果您遵循这条路线,您需要将表单实例传递给模板。
      • 谢谢!这有助于澄清。
      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2014-05-15
      • 2011-08-02
      相关资源
      最近更新 更多