避免两次调用GET Ajax加载

时间:2020-11-09 05:51:08

标签: django 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中,并使用(GLOBAL)保存的值().load()返回进行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 )

这对我来说似乎并不优雅,我不知所措,是的,但是我认为这不是最好的解决方案。

有什么主意要避免这种情况发生吗?

打招呼,​​非常感谢您

1 个答案:

答案 0 :(得分:0)

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

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/?filters="+ps_id); > <-----HERE
              },
       error: function (res,ras,rus) {
              }
          });
      });

views.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

我认为,如果这是正确的进行方式,至少会更优雅。

我希望其他人会觉得这个答案有用。 很抱歉给您带来不便和提出一些琐碎的问题。向所有人致意。