【问题标题】:Error in formatting: AttributeError: 'JsonResponse' object has no attribute '_headers'格式错误:AttributeError:“JsonResponse”对象没有属性“_headers”
【发布时间】:2020-12-05 06:35:27
【问题描述】:

我正在使用 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 内部服务器错误吗?

【问题讨论】:

  • 我遇到了一个完全不同的错误。我从正确的位置导入了 JsonResponse。你有不同的导入吗?

标签: javascript django jsonresponse


【解决方案1】:

如果您从正确的位置导入 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 属性的示例。

【讨论】:

  • 感谢梅尔文!我修复了将序列化从 "username":self.username 更改为 "username": self.username_p.username 的问题
猜你喜欢
  • 2018-03-11
  • 2015-04-07
  • 2021-07-10
  • 2021-03-18
  • 1970-01-01
  • 2023-03-22
  • 2021-04-06
  • 2018-03-15
  • 2021-05-08
相关资源
最近更新 更多