首页 > 解决方案 > 格式错误:AttributeError:“JsonResponse”对象没有属性“_headers”

问题描述

我正在使用 Django 和 JavaScript 构建一个应用程序。在 Java 中,我有一个如下所示的函数:

fetch('/posts')
.then(response => response.json())
.then(posts => {

JavaScript 代码的第一行实际上调用了我的 .views 中的“post_list”函数

from django.contrib.auth.decorators import login_required
from django.http import JsonResponse

from .models import Post

@login_required
def post_list(request):
    posts = Post.objects.filter(username=request.user)
    posts = posts.order_by("-timestamp").all()
    return JsonResponse([p.serialize() for p in posts], safe=False)

但随后程序在最后一行崩溃(当我尝试返回 JsonResponse 时)并且我收到 500 Internal Server Error。结果,我没有收到响应,并且我的 JavaScript .then(response ..... 行没有运行。

我不确定这是否与回答问题有关,但我的模型如下所示:

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class Post(models.Model):
    username = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
    post = models.CharField(max_length=365)
    like = models.PositiveIntegerField(default=0)
    timestamp = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"{self.username} posted {self.post} the {self.timestamp}, and the post has {self.like} likes"
        
    def serialize(self):
        return {
            "id": self.id,
            "username":self.username,
            "post": self.post,
            "like": self.like,
            "timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
        }

那么,有谁知道为什么我会收到 500 内部服务器错误?

标签: javascriptdjangojsonresponse

解决方案


如果您从正确的位置导入 JsonResponse,您应该不会看到此错误。相反,您应该收到一个错误“用户对象不是 JSON 可序列化”,您可以通过执行以下操作来修复它:

# models.py
from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()


class Post(models.Model):
    username = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
    post = models.CharField(max_length=365)
    like = models.PositiveIntegerField(default=0)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.username} posted {self.post} at {self.timestamp}, and the post has {self.like} likes"

    def serialize(self):
        return {
            "id": self.id,
            "username": {
                "username": self.username.username,
                "displayName": self.username.get_full_name(),
                "lastLogin": str(self.username.last_login.replace(microsecond=0)),
            },
            "post": self.post,
            "like": self.like,
            "timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
        }

作为一些额外的建议:

  • 不要将用户对象称为用户名:当您没有获得用户名而是完整的用户对象时,它会变得混乱
  • Javascript 完全能够以对访问者有意义的方式呈现日期格式,因此最好以 ISO-8601 格式传输日期时间,python 和 Javascript 都可以处理。我已将其添加为用户序列化的 lastLogin 属性的示例。

推荐阅读