我刚刚开始使用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)
但我不确定我是否走上了正确的道路,或者偏离了最佳做法。任何输入都很受欢迎 - 关于如何处理单个模板文件以处理添加或编辑行为的具体想法。也欢迎链接到示例。
谢谢!
答案 0 :(得分:16)
绝对没有理由使用单独的模板来添加/编辑不同类型的事物。考虑:
{# 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. ...
答案 1 :(得分:1)
我试图克服此问题的最简单方法是不将SubmitField
包含在( BookForm )表单中。我们可以将表单提交值作为变量传递给表单,例如,在 edit_book 路由中的submit='Update'
和submit='Add Book'
。
在路线中,如果post方法为'GET',则在字段中填充与书本有关的详细信息