Python Flask-WTF-使用相同的表单模板进行添加和编辑操作

我刚刚开始使用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)

但是我不确定我是在正确的轨道上还是偏离最佳实践。感谢任何输入-有关如何处理单个模板文件以处理添加或编辑行为的特定想法。也欢迎示例链接。

谢谢!

回答:

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

{# 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. ...

以上是 Python Flask-WTF-使用相同的表单模板进行添加和编辑操作 的全部内容, 来源链接: utcz.com/qa/430545.html

回到顶部