2013-04-10 50 views
2

我在使用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) }}'> 

我覺得在這裏我必須忽略一些東西。有任何想法嗎?

+0

是'url_for()'服務器端功能?或者它在瀏覽器的客戶端上運行? – PatrickSteele 2013-04-11 02:46:21

回答

3

您的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> 
+0

啊,當然,現在你說出來就有道理了。我現在感覺有點傻。 不幸的是,您的解決方案無法正常工作,因爲如果您不提供所需的參數,Flask的url_for()會失敗。但是,我可以通過其他方式解決它。非常感謝! – Limescale 2013-04-11 09:08:52