2012-12-14 78 views
0

給定一個帶有多對多模型的Django模板變量,是否可以將它傳遞給一個Javascript函數並訪問它?如何從Javascript訪問Django多對多模型?

(我試圖得到的是當前用戶所屬的組的列表,包括pk)。

例如,如果我有一個用戶jsmith的屬於兩個組,阿爾法測試

<html> 
<script type="text/javascript"> 
    mangle_data("{{ user.name }}", "{{ user.groups }}", "{{ user.groups.all }""); 
</script> 
</html> 

function mangle_data(username, groups, all) { 
    alert("username = " + username); // works. output = "jsmith" 
    alert("user.groups = " + groups); // output = "django.db.models.fields.related.ManyRelatedManager object" 
    alert("all = " + all); // output = "[Group alpha; Group beta;]" 
} 

在所有情況下,傳遞到的Javascript的參數,是一個單個平面化串。理想情況下,我會得到一個對象,甚至是一個包含組名和列表pk的列表。

當然,我可以找到一個組的PK,因爲它的名字 - 但這是更多的步驟。如果我可以直接從Django模板獲取數據到Javascript中,那麼它會更清晰。

回答

1

如何清盤解決這個,是使用一個上下文處理器對數據進行格式化,並把它傳遞給模板變量:

context_processors.py 

def site_settings(request): 
    if request.user.is_authenticated(): 
     user_groups = "+".join(['{"id":%s, "name":"%s"}' % 
      (grp['id'], grp['name']) for grp in rquest.user.groups.values()]) 
    else: 
     user_groups = '' 
    return {'USER_GROUPS': user_groups, } 

template.html 

<html> 
<script type="text/javascript"> 
    mangle_data("{{ USER_GROUPS|safe }""); 
</script> 
</html> 

handle_data.js 

function mangle_data(groups) { 
    var groups_json = '[' + groups.split('+').join(',') + ']'; 
    var groups_OBJ = JSON.parse(groups_json); // this is now a Javascript object. 
} 
1

在上下文變量中,serializing user.groups怎麼樣?

如果您將這些序列化爲JSON,您可以輕鬆地從您的頁面的JS中解析出它。

+0

是否有這樣做直接Django模板內的一些方法? –

+1

@JohnC你總是可以編寫一個模板標籤/過濾器。 –