Jinja2:Flask的url_for()与Knockout的attr绑定结合使用
我在使用Jinja2作为模板引擎的Web应用程序中一起使用Flask和Knockout。在我的瓶的应用程序,我有两个途径:/accounts/
和/accounts/<int:acc_id>/
,这是这个样子:Jinja2:Flask的url_for()与Knockout的attr绑定结合使用
@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/
路径负载与淘汰赛视图模型的HTML页面。视图模型,然后AJAX加载账户列表为observableArray
,并呈现这样的事情:
<!-- ko foreach: accounts -->
<span data-bind="text: name></span>
<!-- /ko -->
有关单个帐户的/accounts/<int:acc_id>/
路线显示的信息。
我想要做的是使用url_for()
在上面的HTML片段中的每个帐户上创建一个href
属性,将该帐户的ID作为参数传递。我无法使用Knockout模型中的参数对url_for()
进行Python调用。
一对夫妇的变化到目前为止,我已经试过的:
串联标识加入url_for函数调用:
<a data-bind="attr: { href: '{{ url_for('account', acc_id=' + id() + ' }}'}">
<span data-bind="text: name"></span>
</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) }}'>
我觉得在这里我必须忽略一些东西。有任何想法吗?
您的python代码(url_for
)在生成HTML时运行在服务器端,但在页面呈现时,Knockout代码在浏览器中运行您的代码。所以你不能将Knockout的变量传递给python url_for
方法。
你可以做的是只产生/accounts/
并建立URL与KO休息:
<a data-bind="attr: { href: '{{ url_for('account') }}' + '/' + id() }">
<span data-bind="text: name"></span>
</a>
啊,当然,现在你说出来就有道理了。我现在感觉有点傻。 不幸的是,您的解决方案无法正常工作,因为如果您不提供所需的参数,Flask的url_for()会失败。但是,我可以通过其他方式解决它。非常感谢! – Limescale 2013-04-11 09:08:52
是'url_for()'服务器端功能?或者它在浏览器的客户端上运行? – PatrickSteele 2013-04-11 02:46:21