给定一个具有多对多模型的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,那就更清晰了。
答案 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.
}