从JS提取到Django视图时遇到问题

时间:2020-09-23 03:09:54

标签: javascript django

我可以在以下方面使用帮助来理解和纠正错误:

JavaScript在页面上的某些事件期间调用以下函数:

function load_homePage() {
    
    // Pull all posts
    fetch('/homepage')
    .then(response => response.json())
    .then(posts => {
      
      // Print all posts
      posts.forEach( function(post) {
          console.log(post)
        })
    })
}

最终,我将让JS创建动态Div,以显示来自调用的所有数据。

提取正在调用以下视图:

@csrf_exempt
@login_required
def view_homePage(request):
    
    posts = Post.objects.all()
    
    # Return entire set of posts to webpage
    return JsonResponse([post.serialize() for post in posts],   
      safe=False)

对于Django,我想要的只是查询数据库,从Post模型中提取所有数据,然后将其发送回页面。模型如下:

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

    class User(AbstractUser):
        pass

    class Post(models.Model):
        posterID = models.ForeignKey("User", on_delete=models.CASCADE,  
           related_name="post")
        content = models.TextField(blank=False)
        timestamp = models.DateTimeField(auto_now_add=True)
    
        def serialize(self):
            return {
                "id": self.id,
                "posterID": self.posterID,
                "content": self.content,
                "timestamp": self.timestamp
            }

Url.py文件也已完成:

urlpatterns = [
     path("", views.index, name="index"),
     path("login", views.login_view, name="login"),
     path("logout", views.logout_view, name="logout"),
     path("register", views.register, name="register"),
     path("post", views.new_post, name="posts"),
     path("homepage", views.view_homePage, name="homepage")
]

当我尝试触发事件时,出现以下错误:

TypeError: Object of type User is not JSON serializable
[23/Sep/2020 02:51:09] "GET /homepage HTTP/1.1" 500 107660

有人可以告诉我我做错了什么以及如何正确做吗?谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

我想出了答案,并认为如果对任何人都有价值,我会在这里发布。问题出在模型代码中。具体在这里:

def serialize(self):
    return {
       "id": self.id,
  --->"posterID": self.posterID,<----
       "content": self.content,
       "timestamp": self.timestamp
    }

作为用户的外键,它返回: “ posterID”:用户:someName

我通过将违规行更改为:

"posterID": self.posterID.id,