0

多対多モデルのDjangoテンプレート変数が与えられた場合、それをJavascript関数に渡してアクセスすることは可能ですか?

(私が取得しようとしているのは、現在のユーザーが属しているpkを含むグループのリストです)。

たとえば、アルファベータの2つのグループに属するユーザー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にデータを取得できれば、はるかにクリーンになります。

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 に答える