使用 Jquery 和 Ajax 查询 Django 数据库

Posted

技术标签:

【中文标题】使用 Jquery 和 Ajax 查询 Django 数据库【英文标题】:Querying Django database with Jquery and Ajax 【发布时间】:2019-08-15 03:02:57 【问题描述】:

我有一个 POST 请求,在提交表单时将数据传递到我的数据库。

我的意思的照片:

home.html

 <script type="text/javascript">
        $(document).ready(function()
            var postForm = $(".form-post")

            //POSTING DATA INTO DATABASE
            postForm.submit(function(event)
                event.preventDefault();
                var thisForm =$(this)
                var actionEndPoint = thisForm.attr("action");
                var httpMethod = thisForm.attr("method");
                var formData = thisForm.serialize();

                $.ajax(
                    url: actionEndPoint,
                    method: httpMethod,
                    data: formData,
                    success:function(data)
                        console.log(data)
                        $(".form-post")[0].reset();

                        //I WANT TO PASS THE NEWLY ADDED DATA TO DISPLAY WITHOUT REFRESH
                        $.ajax(
                        type: 'GET',
                        url: '% url "postInfo" %',
                        dataType : 'json',
                        success: function(cdata)
                            $.each(cdata, function(id,posts)
                            $('#cb').append('<li>' +posts['fields'].title+ '  ' +posts['fields'].body+ '</li>');
                        );
                    
                    );

                    ,
                    error:function(errData)

                    

                )
            )

        )
    </script>

现在每次我添加帖子时它都会显示多个相同的帖子。

这是我的看法

views.py

def postInfo(request): # GET REQUEST
    if request.method == 'GET' and request.is_ajax():
        mytitle = Post.objects.all().order_by('-date_posted')
        response = serializers.serialize("json", mytitle)
        return HttpResponse(response, content_type='application/json')



def posting(request):  # POST REQUEST
    if request.method == 'POST' and request.is_ajax():
        title = request.POST.get('postTitle')
        content = request.POST.get('postContent')
        post = Post()
        post.title = title
        post.body = content
        post.author = request.user
        post.save()
        return HttpResponse('') 

models.py

class Post(models.Model):
    title = models.CharField(max_length=50)
    body = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

我怎样才能让它只显示我添加的帖子+数据库中的内容而不显示多个相同的帖子?感谢您的帮助。

【问题讨论】:

【参考方案1】:

您获得了倍数,因为您要求在 POST 请求成功后发送数据库中的每个帖子。

假设 cdata 是一个数组,你可以这样做

let innerhtml;
cdata.forEach(function(obj) 
    innerHtml.append(`<li>$data['fields'].title $data['fields'].body</li>`);
);

$('#cb').html(innerHtml);

$('#cb').html(...) 将替换元素的 HTML 内容而不是添加到其中,因此您不会得到任何重复的条目。同样在append 方法中使用template literal 可以使事情变得更简洁。

或者您可以只发送您刚刚在posting 视图中创建的帖子HttpResponse。当您减少提交表单时提出的请求数量时,这也会更快。

views.py

# Other endpoints
...

def posting(request):  # POST REQUEST
    if request.method == 'POST' and request.is_ajax():
        title = request.POST.get('postTitle')
        content = request.POST.get('postContent')
        post = Post()
        post.title = title
        post.body = content
        post.author = request.user
        post.save()

        # Send new post as response
        response = serializers.serialize('json', post)
        return HttpResponse(response, content_type='application/json') 

home.html

<script type="text/javascript">
  $(document).ready(function()
    var postForm = $(".form-post");

    // POSTING DATA INTO DATABASE
    postForm.submit(function(event)
      event.preventDefault();
      var thisForm = $(this);
      var actionEndPoint = thisForm.attr("action");
      var httpMethod = thisForm.attr("method");
      var formData = thisForm.serialize();

      $.ajax(
        url: actionEndPoint,
        method: httpMethod,
        data: formData,
        success: function(data) 
          console.log(data);
          $(".form-post")[0].reset();

          // Add the new post to $('#cb')
          $('#cb')
            .append(`<li>$data['fields'].title $data['fields'].body</li>`);         
        ,
        error: function(errData)
          // Do something
        
      )
    )

  )
</script>

【讨论】:

感谢您的回复,我已更改为您建议在 HttpResponse 中发送帖子的内容,但我现在收到 TypeError: 'Post' object is not iterable。我正在使用 - from django.core import serializers 进行序列化。同样适用于@schillingt 查看您正在使用的序列化程序的文档,serialize 将迭代器作为其第二个参数,这就是您看到该错误的原因。如果你看看这个问题***.com/questions/2391002/… 有人建议serialize('json', [post]) 应该可以工作。请记住,您现在将获得一个数组作为响应。 另外,您可能想研究使用 Django Rest Framework 来构建您的 API django-rest-framework.org。 感谢终于让它工作了!使用`post_arr = serializers.serialize('json', [post]) response = post_arr[1:-1]`【参考方案2】:

您可以让POST 视图返回序列化实例,如下所示。它可能不完全正确,因为我不知道您使用什么进行序列化,但它应该给您一个想法。

如果您不喜欢这样,您可以将帖子的 id 作为data-post-id 属性注入到 html 中,然后仅将其附加到 $('#cb')(如果它不存在)。

def posting(request):  # POST REQUEST
    if request.method == 'POST' and request.is_ajax():
        title = request.POST.get('postTitle')
        content = request.POST.get('postContent')
        post = Post()
        post.title = title
        post.body = content
        post.author = request.user
        post.save()
        response = serializers.serialize("json", post)
        return HttpResponse(response, content_type='application/json')

$.ajax(
    url: actionEndPoint,
    method: httpMethod,
    data: formData,
    success:function(data)
        console.log(data)
        $(".form-post")[0].reset();
        $('#cb').append('<li>' +data['fields'].title+ '  ' +data['fields'].body+ '</li>');
    
    );

    ,
    error:function(errData)

    

)

【讨论】:

感谢您的回复,我遇到了与下面所述相同的问题。我现在得到 TypeError: 'Post' object is not iterable。

以上是关于使用 Jquery 和 Ajax 查询 Django 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery 和 Ajax 查询 Django 数据库

Jquery .ajax():唯一的 AJAX 查询标识符?

如何使用ajax jquery显示插入的查询数据而不刷新

如何使用 ajax、查询、json 加载页面? [复制]

在 AJAX 查询之后使用 jQuery 解释 PDO 错误

PHP 使用jQuery查询跨域AJAX