如何在 Django 中通过 POST Ajax 调用获取用户?

How to get user with POST Ajax call in django?

我正在尝试使用 AJAX 在网站上实现对产品的评论,但遇到了在这种情况下我无法收到评论作者的问题代码:

new_comment.author = request.user

在这种情况下我得到了这个错误:“异常值:

User 类型的对象JSON 不可序列化

但是在没有用户的情况下,我从后端获取参数并得到结果 200,就像这样

author  ""
content "dasda"
created_at  "2021-12-31T07:34:12.766Z"
product 4

那么问题是“author=request.user”如何才能连载?还是只有Django Rest Framework才能实现? (我没有DRF经验,但理论上知道一些)

有人可以给点建议吗?

def ajax_receiver(request):
    product = Product.objects.get(id=4)
    is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
    if request.method == 'POST' and is_ajax and request.user.is_authenticated:
        form = UserCommentForm(data=request.POST)
        if form.is_valid():
            new_comment = form.save(commit=False)
            #new_comment.author = request.user
            new_comment.product = product
            new_comment.save()
            comment_info = {
            "author": new_comment.author,
            "content": new_comment.content,
            "created_at": new_comment.created_at,
            "product": product.id,
            }
            return JsonResponse({"comment_info": comment_info}, status=200)
    else:
        return JsonResponse({"success": False}, status=400)

谢谢大家的推荐! 最后我用 Django Rest Framework 做了最后一个版本的代码,希望它能帮助遇到同样问题的人。不要忘记在 serializers.py 中创建您需要的序列化程序并导入 DRF 需要的模块:

from .serializers import CommentSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['POST'])
def ajax_receiver(request):
    product = Product.objects.get(id=4)
    is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
    if request.method == 'POST' and is_ajax and request.user.is_authenticated:
        form = UserCommentForm(data=request.POST)
        if form.is_valid():
            new_comment = form.save(commit=False)
            new_comment.author = request.user
            new_comment.product = product
            new_comment.save()
            serializer = CommentSerializer(new_comment, many=False)
            return Response(serializer.data, template_name='ajax_test.html')
    else:
        return JsonResponse({"success": False}, status=400)

在您的例子中,您试图将 User 模型对象转换为 json。但是 JsonResponse 使用 json.dumps 方法进行转换。而且它无法将模型、class和复杂对象转换为json。虽然 JsonResponse 有一些特殊的功能,比如它可以转换 datetime 和 uuid 字段。

对于你的情况,我认为手动创建 author dict 会更好。

  • 改成comment_info dict 就变成这样了

          comment_info = {
             "author": {
                "name": new_comment.author.name,
                "id": new_comment.author.id
                # -------- so on
             },
             "content": new_comment.content,
             "created_at": new_comment.created_at,
             "product": product.id,
          }
    

现在您可以使用 JsonResponse({"comment_info": comment_info}, status=200) 进行 json 响应。