0

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

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

例如,如果我有一个用户jsmith属于两个组,alphabeta

<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 中,那就更简洁了。

4

2 回答 2

1

在上下文变量中序列化user.groups怎么样?

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

于 2012-12-14T18:38:34.327 回答
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.
}
于 2012-12-20T15:27:50.660 回答