我在django有一个投票模板。它一次显示一个来自SQLite3数据库的条目,当我用按键向上或向下投票时,投票被保存在数据库中,投票模板重新加载,一个新的随机条目通过视图提供(模型管理器将随机条目提供给视图)。在
这是我的理想情况:我希望通过投票模板显示三个不同的条目。-3不同的按键会对3的条目进行投票,但它们只会刷新投票计数,不是输入文本。-3不同的按键会分别选择新的随机条目。目前,我正在尝试使用1条目。在
困难之处:我想我应该做的是将投票条目的id从html传递给视图中的投票函数,然后将id传递到中的投票模板视图.py只是为了刷新分数,而不是用其他条目替换它。在
简单的方法(首选!):在进行了更多的研究并查看了以下问题后:Refresh a div in Django using JQuery and AJAXReload entire page in Ajax on Django?How to correctly refresh a div using Jquery/Ajax in a Django templatePassing list of values to django view via jQuery ajax call
我觉得问题的关键是这个;
当我投票时,我想刷新投票页面上的投票。为了防止过度杀戮,我相信div更新可以在投票更新的模板侧进行,而不是切换条目(当整个投票.html重新加载)。在
要更改显示的条目,是否可以切换访问的条目id,并在按下另一个按钮时刷新div(从db获取新条目)?我想我必须将条目id传递给视图.py,但也许我可以在模板中完成所有操作?如果我可以不出错地上下切换db条目,就不需要从视图中随机获取条目。在
为此我改变了投票.html以下代码包括:
$.ajax({
success: function() {
$(this).html();
}
按钮按下后。它允许投票,但不刷新条目。我从一些SO问题中了解到,我必须传递一些值或div来更新,但当我这样做时遇到了麻烦。我一直试图在投票中获得通过,但剧本在中间,而不是在它之外。试图通过投票似乎也行不通,实际上妨碍了投票
^{pr2}$有人能帮我吗?
我觉得很接近-这里是一些代码片段
模型.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
投票.html
<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>
视图.py
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
我不知道你为什么说Django不适合异步请求。对于那些人来说,这是完全可以的:他们在任何实质性的方面与正常的不同。对于非常简单的任务,您不需要任何这些,或者您提到的任何工具:您首先不希望任何异步的东西。在
这里有几个问题。首先,你的大多数尝试似乎都在渲染整个投票.html模板。这不是你想要的,对吧:你只想呈现一部分,包含你想要的投票的比特。此外,您将传递一个投票实例
v
,作为“voting_entry_list”上下文变量,这意味着当模板尝试在for循环中迭代列表时,它将引发异常,因为单个实例不可编辑。如果使用浏览器开发工具检查Ajax响应,您可能会发现,大多数尝试都会显示“不可编辑”异常。在然后,Javascript本身也有问题。我完全不知道你为什么把
location.reload()
放在两个处理程序中。这会导致整个页面被刷新,向服务器发出一个全新的非Ajax请求,完全忽略您已有的Ajax响应,并刷新整个页面。相反,您需要通过普通的jquerydom操作函数,将Ajax响应中获得的HTML插入到页面的适当位置。在相关问题 更多 >
编程相关推荐