在一个浏览器中强制刷新/重新加载URL,当第二个浏览器窗口的URL更新时
我有一个用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 }} {{ 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 个回答
试着这样做:
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
有没有简单的方法可以强制更新表格数据,或者在最坏的情况下,从投票链接或views.py中重新加载表格(索引)网址的数据呢?
你想要的是一种让浏览器自动检查后端更新的方法,然后在不“刷新”的情况下自己更新。
这就像StackOverflow上的通知功能。如果你收到新消息或者你的信誉发生变化,顶部的栏会自动更新,而你不需要手动刷新。
要实现这个功能,你有两个选择:
你可以让前端每隔x秒去查询一次数据库,然后触发更新。这基本上就是一种自动按“F5”的方式。
你可以打开一个套接字,这样当后端更新时,前端也会自动更新。
无论哪种方式,你都需要在前端添加一些逻辑。对于第二种选择,你可以使用django-socketio
这个应用,它利用socket.io库来实现WebSocket
协议,这是一种在浏览器和后端之间打开套接字(可以理解为一种永久连接)的方法。
在后端,你会创建一个频道,用来传输消息。浏览器会订阅这些频道并进行监听。一旦后端传输了消息,浏览器就可以触发更新(例如,向表格中添加新行,弹出警告等)。