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

时间:2014-07-31 22:17:01

标签: python django

我有一个使用django编写的网站,该网站包含文本输入,投票和按年龄和投票排序的条目的表格显示,所有这些都在一个页面上: http://www.highscore.a2hosted.com/index/

现在我想要单独的输入,投票和表格页面,我已经开始使用投票页面了。这很好用,并且投票被添加到底层sqlite3数据库中的条目,但我必须手动刷新表页(索引)。

是否有一种简单的方法可以强制更新,或者在最后的手段,从表决(url)或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 个答案:

答案 0 :(得分: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 :(得分:1)

  

是否有一种简单的方法可以强制更新,或者在最后的手段重新加载   表格(索引)中的表格数据来自投票网址中的操作   或views.py?

您正在寻找的方法是让浏览器自动检查后端的更新,然后在不“刷新”的情况下自行更新。

类似于通知在StackOverflow上的工作方式。如果您收到新消息或信誉发生变化,则顶栏会自动更新,无需您刷新。

要完成此任务,您有两种选择:

  1. 您可以从前端每 x 秒轮询一次数据库,然后触发更新。这基本上是一种命中“F5”的自动方式。

  2. 您可以打开套接字,以便在后端更新时更新前端。

  3. 无论哪种方式都需要你添加一些前端逻辑。对于选项#2,您可以使用django-socketio使用socket.io库的应用来实现WebSocket protocol,这是一种打开套接字的方法(想想看就像永久连接一样,在浏览器和后端之间。

    在后端,您将创建一个通道,您可以在该通道上传输消息。浏览器将订阅这些频道并收听。一旦从后端传输消息,浏览器就会触发更新(例如,向表中添加新行,弹出警告等)。