我在以 Jinja2 作为模板引擎的 Web 应用程序中同时使用 Flask 和 Knockout。在我的 Flask 应用程序中,我有两条路线:/accounts/
和/accounts/<int:acc_id>/
,看起来像这样:
@app.route("/accounts/")
@login_required
def accounts():
return render_template("accounts.html")
@app.route("/accounts/<int:acc_id>/")
@login_required
def account(acc_id):
return render_template("account.html",
account_id=acc_id)
该/accounts/
路由加载一个带有 Knockout 视图模型的 HTML 页面。视图模型然后 AJAX 将帐户列表加载到 an 中observableArray
并呈现如下内容:
<!-- ko foreach: accounts -->
<span data-bind="text: name></span>
<!-- /ko -->
该/accounts/<int:acc_id>/
路由显示有关单个帐户的信息。
我要做的是href
在上面的 HTML 片段中使用 为每个帐户创建一个属性url_for()
,将帐户的 id 作为参数传递。我在使用url_for()
Knockout 模型中的参数进行 Python 调用时遇到问题。
到目前为止我尝试过的几种变体:
将 id 连接到 url_for 函数调用中:
<a data-bind="attr: { href: '{{ url_for('account', acc_id=' + id() + ' }}'}">
<span data-bind="text: name"></span>
</a>
这会产生 a ValueError: invalid literal for int() with base 10: '+ id() +'
,因为它将对 id() 的调用读取为字符串文字。
在视图模型中创建一个返回 url_for 字符串的函数:
self.accountUrl = function(account_id) {
return '{{ url_for("admin.account", acc_id=' + account_id + ') }}';
};
并这样称呼它:
<a data-bind="attr: { href: $root.accountUrl(id()) }">
<span data-bind="text: name"></span>
</a>
这导致 href 属性被设置为从 返回的字符串文字accountUrl()
,即 HTML 如下所示:
<a href='{{ url_for("account", acc_id=1) }}'>
我觉得我必须在这里忽略一些东西。有任何想法吗?