如何从Javascript访问Django多对多模型?

时间:2012-12-14 18:34:51

标签: javascript django

给定一个具有多对多模型的Django模板变量,是否可以将其传递给Javascript函数并访问它?

(我想要得到的是当前用户所属的群组列表,包括pk)。

例如,如果我有一个属于两个组的用户 jsmith alpha beta

<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,那就更清晰了。

2 个答案:

答案 0 :(得分:1)

上下文变量中的serializing user.groups怎么办?

如果将这些序列化为JSON,您可以轻松地从页面的JS中检索解析它。

答案 1 :(得分:1)

我如何解决这个问题,就是使用Context Processor来格式化数据,并将其传递给模板变量:

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.
}