如何在 django 中通过 AJAX 请求传递数据?

Posted

技术标签:

【中文标题】如何在 django 中通过 AJAX 请求传递数据?【英文标题】:How to pass data through an AJAX request in django? 【发布时间】:2018-11-10 21:22:21 【问题描述】:

我想在点击页面底部时从数据库中检索数据。

现在,我到目前为止:

urls.py

urlpatterns = [
   url(r'^$', feedViews.index, name='index'),
   url(r'^load/$', feedViews.load, name='load'),
]

views.py

def index(request):
    if request.method == 'GET':
        context = 
                'entry_list': Entry.objects.filter()[:5],
            
        return render(request,'index.html',context)
    else:
        return HttpResponse("Request method is not a GET")

def load(request):
    if request.method == 'GET':
        context = 
                'entry_list': Entry.objects.filter()[:1],
            
        return render(request,'index.html',context)
    else:
        return HttpResponse("Request method is not a GET")

index.html

...
    <script>
$(window).on("scroll", function() 
       if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) 
         console.log( "TEST" );

        $.ajax(
        
            type:"GET",
            url: "/load",
            data:

            ,


         )
       
   );
</script>
...

基本上它会在开始时加载 5 个项目,而我试图实现的是,一旦我到达页面底部,它就会再加载 1 个。 所以 jQuery 工作是因为 console.log('Test') 工作,在我的终端它说

"GET /load/ HTTP/1.1" 200 484

这也很好。

我想我以某种方式搞砸了 ajax。不过我不确定。

您可能会说我是个菜鸟,但我们非常感谢任何帮助。

【问题讨论】:

当我们进行 AJAX 调用时,我们必须返回一个 JsonResponse 而不是渲染任何模板。 @Shashank 所以我必须修改这一行:return render(request,'index.html',context) ?到底是什么? 看看这个:***.com/questions/20306981/… 你可以使用 HttpResponse 或 JsonResponse 【参考方案1】:

使用这样的东西:

import json
from django.http import JsonResponse


def index(request):
    if request.method == 'GET':
        context = 
                'entry_list': Entry.objects.filter()[:5],
            
        return JsonResponse(json.dumps(context), safe=False)
    else:
        return JsonResponse("err_msg": "Failed")

【讨论】:

听起来很有希望,但它说:'QuerySet' 类型的对象不是 JSON 可序列化的 其实用JsonResponse,你不应该用json.dumps @WillemVanOnsem 那你会推荐什么?【参考方案2】:

试试看:

import json
from django.core import serializers
from django.http import JsonResponse

def index(request):
    if request.method == 'GET' and request.is_ajax():
        # Return objects
        entry = Entry.objects.filter()[:5]
        # serializers
        entry2 = serializers.serialize('json', entry)
        # convert JSON
        entry3 = [d['fields'] for d in json.loads(entry2)]
        data = dict()
        data["entry"] = entry3
    return JsonResponse(data)

【讨论】:

好的。谢谢我现在得到了json。有没有办法在不刷新的情况下在我的 html 中显示数据?我找不到解决方案。 很好,第一部分还可以。有几种方法可以在不重新加载页面的情况下修改数据,其中大部分都适用于 Ajax。现在您已经有了包含数据的 JSON,您需要很好地使用 javascript 来创建更新 DOM 的事件。例如,您在操作中加载的项目可以通过 $("#").append () 在操作执行后立即加载到 HTML 中。 Ajax 还允许您在完成之前、完成时、成功和错误时执行操作,从而使您能够更好地控制 DOM。下面是一个例子: $("#novo").on("click", function () $.ajax( type: 'GET', dataType: 'JSON', url: 'select_estado', beforeSend: function () , complete: function () , error: function () , success: function (data) $.each(data.uf, function (key, value) var opcoes = "&lt;option class='rem_estados_tit' value='" + value.estado + "'&gt;" + value.estado + "&lt;/option&gt;"; $('#titulo_eleitor_uf').append(opcoes); ); ); );

以上是关于如何在 django 中通过 AJAX 请求传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在:Django 中通过 URL 传递带空格的变量

如何在控制器laravel 8中通过ajax传递路由链接和图像存储链接

在rails应用程序中通过ajax请求将参数传递给控制器

如何在 moya 中通过 POST 请求传递 JSON 正文

django中通过文件和Ajax来上传文件

在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象