如何在 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 字段。
- 您可以手动创建作者字典
- 您可以创建自定义 json 编码器 class https://docs.djangoproject.com/en/4.0/topics/serialization#s-serialization-formats-json
- 可以使用Django Rest Framework(推荐)
对于你的情况,我认为手动创建 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 响应。
我正在尝试使用 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 字段。
- 您可以手动创建作者字典
- 您可以创建自定义 json 编码器 class https://docs.djangoproject.com/en/4.0/topics/serialization#s-serialization-formats-json
- 可以使用Django Rest Framework(推荐)
对于你的情况,我认为手动创建 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 响应。