Django: 如何在JavaScript中访问当前登录用户的ID?

10

我在视图集中定义了一个 get_queryset 方法。

class BooksViewSet(ReadOnlyModelViewSet):
    serializer_class = BooksSerializer
    permission_classes = (IsAuthorizedToAccess, )

    def get_queryset(self):
        queryset = Books.objects.all();
        return queryset

我想使用JavaScript在一个页面上同时展示当前用户的图书和其他所有用户的图书,但是我已经编写了所有代码,却无法在JS文件中访问当前用户的ID。

if(auther.id == "current user id")
{
}
我想像这样访问用户ID。 所有搜索都告诉我需要将用户ID添加为隐藏字段或传递该ID。但是由于方法只允许返回查询集对象,所以我无法这样做。 请问有谁可以帮助我理解这个问题吗? 编辑:我的解决方案 在我的视图中,我定义了get_context_data方法。
 def get_context_data(self, *args, **kwargs):
    ctx = super(class_name, self).get_context_data(*args, **kwargs)
    ctx["author_id"]=self.request.user.id
    return ctx
在我的模板中,我定义了一个隐藏字段:
<input type="hidden" id="userId" value={{author_id}}>

在我的JS代码中:

var x = document.getElementById("author_id").value;


我认为你可以将用户ID添加到上下文中。 - Jonas Grumann
@JonasGrumann,您能否解释一下上下文的含义? - siddaqui
1
在第一个示例中,他正在将数字添加到上下文中,因此它将在模板中可用:https://docs.djangoproject.com/en/1.9/ref/class-based-views/mixins-simple/ - Jonas Grumann
在 ReadOnlyModelViewSet 中同时使用 get_queryset 和 get_context_data 方法是否可行? - siddaqui
是的。我已经在问题中添加了一个名为“我的解决方案”的部分,以供将来参考。 - siddaqui
显示剩余2条评论
3个回答

22

从Django 2.1开始,引入了一个新的内置模板标签,专门用于这种情况:json_script。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#json-script

新标签将安全地序列化模板值,并保护免受XSS攻击。

不需要设置任何上下文变量,因为请求用户已经包含在每个视图中:

template.html

{{ request.user.id|json_script:"user_id" }}

script.js

const user_id = JSON.parse(document.getElementById('user_id').textContent);

2

您也可以使用模板标签,例如 {{author.id}}。 您还可以将值分配给 JavaScript 变量,然后使用它。

var id = {{ author.id }}

4
如果我的JS不在模板中,而是一个单独的文件,并且我已经将其包含在模板中,那该怎么办? - siddaqui
谢谢你,@stefano。 - siddaqui
1
创建一个函数,您可以通过传递id来调用它,然后您可以调用yourFunction({{author.id}})。 - Stefano

0

如果JavaScript在您的模板文件中,您可以像访问其他内容一样访问它,如下所示:

{% for author in authors %}
    if('{{author.id}}' == "current user id")
    {
    }

{% endfor %}

1
我也尝试了同样的方法,但我的JS文件不在模板中,我已经将其包含进去了。 - siddaqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接