Как получить пользователя с помощью POST Ajax вызова в django?
Я пытаюсь реализовать комментарии для товаров на сайте с помощью AJAX, но столкнулся с проблемой, что не могу получить автора комментария в данном случае код:
new_comment.author = request.user
В этом случае я получил эту ошибку: "Значение исключения:
".Object of type User is not JSON serializable "
".Но без пользователя я получил параметры от back-end и имею результат 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)
В вашем случае вы пытаетесь преобразовать объект модели User в json. Но JsonResponse для преобразования использует метод json.dumps. И он не может преобразовать модель, класс и сложные объекты в json. Хотя JsonResponse имеет некоторые специальные функции, например, он может конвертировать поля datetime и uuid.
- Вы можете создать дикту автора вручную
- Вы можете создать собственный класс кодировщика json https://docs.djangoproject.com/en/4.0/topics/serialization#s-serialization-formats-json .
- Вы можете использовать Django Rest Framework (рекомендация)
Для вашего случая, я думаю, что создание диктанта автора вручную будет лучше.
Просто измените в дикту и это будет выглядеть так.
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 ответа.