我有一个使用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 }} {{ 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>
答案 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上的工作方式。如果您收到新消息或信誉发生变化,则顶栏会自动更新,无需您刷新。
要完成此任务,您有两种选择:
您可以从前端每 x 秒轮询一次数据库,然后触发更新。这基本上是一种命中“F5”的自动方式。
您可以打开套接字,以便在后端更新时更新前端。
无论哪种方式都需要你添加一些前端逻辑。对于选项#2,您可以使用django-socketio
使用socket.io库的应用来实现WebSocket
protocol,这是一种打开套接字的方法(想想看就像永久连接一样,在浏览器和后端之间。
在后端,您将创建一个通道,您可以在该通道上传输消息。浏览器将订阅这些频道并收听。一旦从后端传输消息,浏览器就会触发更新(例如,向表中添加新行,弹出警告等)。