Jquery Django:我可以在模板中对对象投票和ID进行div-ajax刷新而不去查看吗?
我在django有一个投票模板。它一次显示SQLite3数据库中的一个条目,当我用按键向上或向下投票时,投票保存在数据库中,重新加载投票模板,并通过视图提供新的随机条目模型管理器将随机条目提供给视图 这是我的理想情况:我希望通过投票模板显示三个不同的条目。-3个不同的按键将对3个条目进行投票,但它们只刷新投票计数,而不是条目文本。-3个不同的按键将分别选择新的随机条目。现在,我正在尝试一个条目 困难的是:我认为我应该做的是将投票条目的id从html传递到视图中的投票函数,然后将id传递到views.py中的投票模板,以便只刷新分数,而不是用其他条目替换它 首选的简单方式!:经过更多的研究,看看下面的问题: 我觉得关键是这个, 我想在投票时刷新投票页面上条目上的投票。为了防止过度杀伤力,我相信div更新可以在投票更新的模板端进行,而不是在重新加载整个voting.html时切换条目 要更改显示的条目,我是否可以切换已访问的条目id并刷新div?当按下另一个按钮时,是否可以从db获取新条目?我想我必须将条目id传递给views.py,但也许我可以在模板中完成这一切?如果我可以在没有错误的情况下上下切换db条目,我不需要从视图中获取随机条目 为此,我修改了下面的voting.html代码,包括:Jquery Django:我可以在模板中对对象投票和ID进行div-ajax刷新而不去查看吗?,jquery,python,ajax,django,sqlite,Jquery,Python,Ajax,Django,Sqlite,我在django有一个投票模板。它一次显示SQLite3数据库中的一个条目,当我用按键向上或向下投票时,投票保存在数据库中,重新加载投票模板,并通过视图提供新的随机条目模型管理器将随机条目提供给视图 这是我的理想情况:我希望通过投票模板显示三个不同的条目。-3个不同的按键将对3个条目进行投票,但它们只刷新投票计数,而不是条目文本。-3个不同的按键将分别选择新的随机条目。现在,我正在尝试一个条目 困难的是:我认为我应该做的是将投票条目的id从html传递到视图中的投票函数,然后将id传递到view
$.ajax({
success: function() {
$(this).html();
}
按下按钮之后。它允许投票,但不刷新条目。我从一些SO问题中了解到,我必须传入一些值或div以进行更新,但我在这样做时遇到了麻烦。我一直试图通过DIV投票,但是剧本是在div的中间,而不是在它的外面。试图通过voteid似乎也不起作用,实际上阻止了投票
$.ajax({
data: {'voteid': text}
success: function(data) {
$(this).html(data);
}
});
有人能帮我做这件事吗
我感觉很接近——这里是一些代码片段
models.py
voting.html
我不知道你为什么说Django不适合异步请求。这对那些人来说很好:他们与正常人没有任何实质性的区别。对于您非常简单的任务,不需要任何这些或您提到的任何工具:您首先不需要任何异步的东西 这里有几个问题。首先,您的大多数尝试似乎都是呈现整个voting.html模板。这不是您想要的,是吗:您只想渲染一部分,即包含您想要的投票的位。此外,您将传递一个单独的投票实例v作为voting_entry_list上下文变量,这意味着当模板尝试在for循环中迭代列表时,它将引发异常,因为单个实例不可迭代。如果您使用浏览器开发人员工具检查Ajax响应,您可能会发现,您的大多数尝试都会显示这一异常
然后,Javascript本身也存在问题。我完全不知道您为什么在两个处理程序中都放置location.reload。这会导致整个页面被刷新,向服务器发出一个全新的非Ajax请求,完全忽略已经得到的Ajax响应,并刷新整个页面。相反,您需要通过正常的jQuery DOM操作函数将Ajax响应中的HTML插入页面中的适当位置。我编辑了我的问题,以澄清上述混淆。上面所有的代码都很好,只是不是我想要的那种方式。ajax位于index.html中,当投票进入时,它会很好地刷新内容。投票条目列表用词不当,是我拥有的其他列表的命名遗产,正如你现在从上面的models.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
<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 }} {{ 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>
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