如何在 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 = "<option class='rem_estados_tit' value='" + value.estado + "'>" + value.estado + "</option>"; $('#titulo_eleitor_uf').append(opcoes); ); ); );
以上是关于如何在 django 中通过 AJAX 请求传递数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在控制器laravel 8中通过ajax传递路由链接和图像存储链接