Django:我可以在不使用视图的情况下对对象投票和id在模板中进行divajax刷新吗?

2024-10-17 06:17:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

简单的方法(首选!):在进行了更多的研究并查看了以下问题后:Refresh a div in Django using JQuery and AJAXReload entire page in Ajax on Django?How to correctly refresh a div using Jquery/Ajax in a Django templatePassing list of values to django view via jQuery ajax call

我觉得问题的关键是这个;

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

要更改显示的条目,是否可以切换访问的条目id,并在按下另一个按钮时刷新div(从db获取新条目)?我想我必须将条目id传递给视图.py,但也许我可以在模板中完成所有操作?如果我可以不出错地上下切换db条目,就不需要从视图中随机获取条目。在

为此我改变了投票.html以下代码包括:

                        $.ajax({
                           success: function() {
                           $(this).html();
                       }

按钮按下后。它允许投票,但不刷新条目。我从一些SO问题中了解到,我必须传递一些值或div来更新,但当我这样做时遇到了麻烦。我一直试图在投票中获得通过,但剧本在中间,而不是在它之外。试图通过投票似乎也行不通,实际上妨碍了投票

^{pr2}$

有人能帮我吗?

我觉得很接近-这里是一些代码片段

模型.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

投票.html

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

视图.py

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

Tags: div视图模板idreturnrequesthtml条目
1条回答
网友
1楼 · 发布于 2024-10-17 06:17:45

我不知道你为什么说Django不适合异步请求。对于那些人来说,这是完全可以的:他们在任何实质性的方面与正常的不同。对于非常简单的任务,您不需要任何这些,或者您提到的任何工具:您首先不希望任何异步的东西。在

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

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

相关问题 更多 >