首页 > 解决方案 > 避免双重调用 GET Ajax 加载

问题描述

好吧,我正在尝试使用 django 为数据库创建图形界面。我不得不说我正在努力学习,所以我对框架没有太多经验,只是使用纯代码。

我的疑问是: - 尝试使用复选框创建过滤器系统时,我使用 Ajax 能够更新视图而无需刷新。像这样:

   $(document).on('click','#console_check_filter',function(){
        var ps_id;
        ps_id = $(this).attr("data-posts-id");
        $.ajax({
              url: "{% url 'list-view' %}",
              method: 'POST',
              data: {
                  'getfilter': ps_id,
                  'csrfmiddlewaretoken': '{{ csrf_token }}',
              },
              success: function (res, status,data) {
                 $("#list").load("/game/list-view");

              },
              error: function (res,ras,rus) {
              }
          });
      });

但是我遇到的错误是,对于我使用 POST 进行的每次调用,AJAX 函数 ().load() 都会进行另一个调用,从而消除了给我 POST 的变量。这使我无法使用从 POST 收到的信息来创建过滤器。结果:我单击复选框,在控制台中我收到一个带有过滤列表的调用,然后是另一个没有过滤器的调用,因为它不仅是最后一个渲染的,没有数据。为了解决这个问题,我使用 globar 变量将值保存在 POST 中,然后 ().load() 返回以使用保存在 GLOBAL 中的值进行 GET 调用。


filet=""
def game_list(request):
    global filet
    context = {}
    game_filter = request.GET.get('console_check_filter')
    games = Game.objects.all()

    game_post = games
    data = {'success': False}
    page = request.GET.get('page',1)
    game_console_filter=""
    context['games'] = games

    #if request.method=='POST':
    game_console_filter = request.POST.get('getfilter')
    if not game_console_filter:
        game_console_filter = request.GET.get('getfilter')


    if request.method=="POST":
        filet = get_game_console_filter(request,game_console_filter)
    context['games'] = games
    context['game_post'] = filet


    return render(request,'Jocs/list-view.html',context )

这对我来说似乎并不优雅,我已经走出困境,是的,但我认为这不是最好的解决方案。

有什么想法可以避免这种情况发生在我身上吗?

问候,非常感谢你所做的一切

标签: djangoajax

解决方案


显然我比我想象的还要愚蠢。最后的解决方案是通过 URL 发送变量。例子:

阿贾克斯:

$(document).on('click','#console_check_filter',function(){
   var ps_id;
   ps_id = $(this).attr("data-posts-id");
   $.ajax({
       url: "{% url 'list-view' %}",
       method: 'POST',
       data: {
             getfilter': ps_id,
             csrfmiddlewaretoken': '{{ csrf_token }}',
              },
       success: function (res, status,data) {
                 $("#list").load("/game/list-view/?filters="+ps_id); > <-----HERE
              },
       error: function (res,ras,rus) {
              }
          });
      });

视图.py:

#if request.method=='POST':
    game_console_filter = request.POST.get('getfilter')
    if not game_console_filter:
        game_console_filter = request.GET.get('filters') <---HERE

我认为,如果这是正确的方法,至少它会更优雅。

我希望其他人会发现这个答案很有用。很抱歉给您带来不便并提出一些琐碎的问题。祝福大家。


推荐阅读