在一个浏览器中强制刷新/重新加载URL,当第二个浏览器窗口的URL更新时

0 投票
2 回答
885 浏览
提问于 2025-04-18 15:34

我有一个用Django写的网站,里面有文本输入、投票功能,还有一个按年龄和投票数排序的表格,所有这些都在同一页面上:http://www.highscore.a2hosted.com/index/

现在我想把输入、投票和表格分成不同的页面,我已经开始做投票页面了。这个投票功能运行得很好,投票会被添加到底层的sqlite3数据库中,但我需要手动刷新表格页面(index)。

有没有简单的方法可以强制更新,或者在最坏的情况下,从投票页面或views.py中重新加载表格数据?

下面是一些代码片段:

views.py

def index(request):   
  context = {
   'latest_entry_list': Entry.objects.order_by('-pub_date')[:10],
   'high_entry_list': Entry.objects.order_by('-score','-pub_date')[:10],
   'high_entry': Entry.objects.order_by('-score','-pub_date')[:1],
   'low_entry_list': Entry.objects.order_by('score','-pub_date')[:10],
   'voting_entry_list': Entry.objects.unvoted_or_random(),
  }
  return render(request, 'entries/index.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
  return HttpResponse('done')

voting.html

 <div id="Vote" class = "high">
<div style="text-align: center">
  {% 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();
                  });
                return false;
                }       
               });
             });        
          </script>
  {% endfor %}
</div>


根据接受的答案编辑的代码:

谢谢,我选择了你的第一个选项,并在表格页面做了这个:

 <script>
  setTimeout(function() {
  $.ajax({      
    url: "",
    context: document.body,
    success: function(s,x){
        $(this).html(s);
    }
   });
  }, 1000);
 </script>

2 个回答

1

试着这样做:

from django.core.urlresolvers import reverse

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()
        return redirect(reverse('index'))
    #redirect to you index and refrech the data

    else:
       pass
1

有没有简单的方法可以强制更新表格数据,或者在最坏的情况下,从投票链接或views.py中重新加载表格(索引)网址的数据呢?

你想要的是一种让浏览器自动检查后端更新的方法,然后在不“刷新”的情况下自己更新。

这就像StackOverflow上的通知功能。如果你收到新消息或者你的信誉发生变化,顶部的栏会自动更新,而你不需要手动刷新。

要实现这个功能,你有两个选择:

  1. 你可以让前端每隔x秒去查询一次数据库,然后触发更新。这基本上就是一种自动按“F5”的方式。

  2. 你可以打开一个套接字,这样当后端更新时,前端也会自动更新。

无论哪种方式,你都需要在前端添加一些逻辑。对于第二种选择,你可以使用django-socketio这个应用,它利用socket.io库来实现WebSocket协议,这是一种在浏览器和后端之间打开套接字(可以理解为一种永久连接)的方法。

在后端,你会创建一个频道,用来传输消息。浏览器会订阅这些频道并进行监听。一旦后端传输了消息,浏览器就可以触发更新(例如,向表格中添加新行,弹出警告等)。

撰写回答