Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Django:我可以在模板中对对象投票和ID进行div-ajax刷新而不去查看吗?_Jquery_Python_Ajax_Django_Sqlite - Fatal编程技术网

Jquery Django:我可以在模板中对对象投票和ID进行div-ajax刷新而不去查看吗?

Jquery Django:我可以在模板中对对象投票和ID进行div-ajax刷新而不去查看吗?,jquery,python,ajax,django,sqlite,Jquery,Python,Ajax,Django,Sqlite,我在django有一个投票模板。它一次显示SQLite3数据库中的一个条目,当我用按键向上或向下投票时,投票保存在数据库中,重新加载投票模板,并通过视图提供新的随机条目模型管理器将随机条目提供给视图 这是我的理想情况:我希望通过投票模板显示三个不同的条目。-3个不同的按键将对3个条目进行投票,但它们只刷新投票计数,而不是条目文本。-3个不同的按键将分别选择新的随机条目。现在,我正在尝试一个条目 困难的是:我认为我应该做的是将投票条目的id从html传递到视图中的投票函数,然后将id传递到view

我在django有一个投票模板。它一次显示SQLite3数据库中的一个条目,当我用按键向上或向下投票时,投票保存在数据库中,重新加载投票模板,并通过视图提供新的随机条目模型管理器将随机条目提供给视图

这是我的理想情况:我希望通过投票模板显示三个不同的条目。-3个不同的按键将对3个条目进行投票,但它们只刷新投票计数,而不是条目文本。-3个不同的按键将分别选择新的随机条目。现在,我正在尝试一个条目

困难的是:我认为我应该做的是将投票条目的id从html传递到视图中的投票函数,然后将id传递到views.py中的投票模板,以便只刷新分数,而不是用其他条目替换它

首选的简单方式!:经过更多的研究,看看下面的问题:

我觉得关键是这个,

我想在投票时刷新投票页面上条目上的投票。为了防止过度杀伤力,我相信div更新可以在投票更新的模板端进行,而不是在重新加载整个voting.html时切换条目

要更改显示的条目,我是否可以切换已访问的条目id并刷新div?当按下另一个按钮时,是否可以从db获取新条目?我想我必须将条目id传递给views.py,但也许我可以在模板中完成这一切?如果我可以在没有错误的情况下上下切换db条目,我不需要从视图中获取随机条目

为此,我修改了下面的voting.html代码,包括:

                        $.ajax({
                           success: function() {
                           $(this).html();
                       }
按下按钮之后。它允许投票,但不刷新条目。我从一些SO问题中了解到,我必须传入一些值或div以进行更新,但我在这样做时遇到了麻烦。我一直试图通过DIV投票,但是剧本是在div的中间,而不是在它的外面。试图通过voteid似乎也不起作用,实际上阻止了投票

                        $.ajax({      
                           data: {'voteid': text}
                           success: function(data) {
                              $(this).html(data);
                           }
                     });
有人能帮我做这件事吗

我感觉很接近——这里是一些代码片段

models.py

voting.html


我不知道你为什么说Django不适合异步请求。这对那些人来说很好:他们与正常人没有任何实质性的区别。对于您非常简单的任务,不需要任何这些或您提到的任何工具:您首先不需要任何异步的东西

这里有几个问题。首先,您的大多数尝试似乎都是呈现整个voting.html模板。这不是您想要的,是吗:您只想渲染一部分,即包含您想要的投票的位。此外,您将传递一个单独的投票实例v作为voting_entry_list上下文变量,这意味着当模板尝试在for循环中迭代列表时,它将引发异常,因为单个实例不可迭代。如果您使用浏览器开发人员工具检查Ajax响应,您可能会发现,您的大多数尝试都会显示这一异常


然后,Javascript本身也存在问题。我完全不知道您为什么在两个处理程序中都放置location.reload。这会导致整个页面被刷新,向服务器发出一个全新的非Ajax请求,完全忽略已经得到的Ajax响应,并刷新整个页面。相反,您需要通过正常的jQuery DOM操作函数将Ajax响应中的HTML插入页面中的适当位置。

我编辑了我的问题,以澄清上述混淆。上面所有的代码都很好,只是不是我想要的那种方式。ajax位于index.html中,当投票进入时,它会很好地刷新内容。投票条目列表用词不当,是我拥有的其他列表的命名遗产,正如你现在从上面的models.py中看到的那样,它实际上只是一个条目………..我同意我想要摆脱位置重新加载,您的评论鼓励我,我想做的很简单,但您有什么建议?
class EntryManager(models.Manager): # TO RETURN ONE RANDOM ENTRY
def random(self):      
    random_entries = self.filter(voted = True).order_by('?') # random entry 
    return random_entries[:1] # return latest
    <div class = "table">
  <div id="Vote" class = "vote">
  <div style="text-align: left">
  {% for entry in voting_entry_list %} 
    <li><a href="/entries/{{ entry.id }}/">{{ entry.text }}&nbsp{{ entry.score }}</a></li>
    <p>
    <input type="submit" id="voteid" name='voteid' value="{{ entry.id }}" autofocus value="" onfocus="this.value = this.value;" class = "transparent"/>
          <script>
            $(document).ready(function() {
              $("#voteid").bind("keydown", function(e) { //input type=id above
                if (e.keyCode == 38) {
                  var text = $("#voteid").val();        
                  var args = {'voteid':text};       
                  $.get("/voteup/", args).done(function(data) {
                    console.log("message: " + data);
                    //location.reload();
                    $.ajax({
                       success: function() {
                           $(this).html();
                       }
                     });
                  });
                return false;
                }
                if (e.keyCode == 40) {
                  var text = $("#voteid").val();        
                  var args = {'voteid':text};       
                  $.get("/votedown/", args).done(function(data) {
                    console.log("message: " + data);
                    //location.reload();
                    $.ajax({
                       success: function() {
                           $(this).html();
                       }
                     });    
                  });
                return false;
                }       
              });
            });     
          </script>
     {% endfor %}
      </div>
      </div>
  </div>
def voting(request):
 context = {
  'voting_entry_list': Entry.objects.random(),
 }
 return render(request, 'entries/voting.html', context);  

def voteup(request):
 voting_id = request.GET.get('voteid')
 if request.method=='GET':
    v = Entry.objects.get(pk=voting_id)
    v.score +=1 
    v.voted=True 
    v.save() 
 else:
    pass
 context = {
  'voting_entry_list': v,
  }
 return render('entries/voting.html', {'voting_entry_list': v})

 # not working? no refresh ^
 # Tried these;
 # return render_to_response('voting.html', RequestContext(request, {'voting_entry_list': v})) #no refresh 
 # return render(request, 'entries/voting.html', context); #no refresh
 # return HttpResponse('done') # Only on template reload
 # return render('voting.html', context); #no refresh
 # return HttpResponseRedirect('entries/voting.html') #no refresh