如何在 Django + jQuery 中刷新页面的一部分?
How to refresh parts of a page in Django + jQuery?
我创建了一个演示项目,其中我有两个名为“1”和“2”的 link,并显示数字 1 或 2,具体取决于单击哪个 link。
models.py
class Count(models.Model):
num = models.IntegerField(default=0)
urls.py
urlpatterns = [
url(r'^home/$', views.home, name='home'),
url(r'^count/(?P<pk>\d+)/$', views.count, name='count'),
]
views.py
def home(request):
c = Count.objects.filter(id=1)
return render(request, "alpha/home.html", {'c': c})
def count(request, pk):
c = Count.objects.filter(id=1).update(num=pk)
return HttpResponseRedirect(reverse('alpha:home'))
home.html
<html>
<head>
<script type="text/javascript" src="jquery-2.1.4.min.js"></script>
</head>
<body>
{% for c in c %}
<span id="num"> {{ c.num }} </span>
{% endfor %}
<a href="#" onclick="$.ajax({
url: '{% url 'alpha:count' 1 %}',
success: function(data) {
$('#num').text({{ c.num }});
}
})">1</a>
<a href="{% url 'alpha:count' 2 %}">2</a>
</body>
</html>
如您所见,count
视图更新模型,然后重新加载 home
视图,从而刷新答案(即 1 或 2)。但是在模板文件中,我尝试包含 jQuery 库并尝试以页面不重新加载的方式调用第一个 link。我对 JS 了解很少,所以这基本上是 copy/paste 代码。现在单击第一个 link 不会执行任何操作。我做错了什么?
您的 count
视图应该 return 计算值而不是重定向:
def count(request, pk):
c = Count.objects.filter(id=1).update(num=pk)
return new HttpResponse(pk)
您的 AJAX 调用应根据服务器的响应更新 span
的值:
$.ajax({
url: '{% url 'alpha:count' 1 %}',
success: function(data) {
$('#num').text(data);
}
})
此外,我会将 AJAX 提取到一个函数中,例如:
function updateCount(value){
$.ajax({
url: '/count/' + value,
success: function(data) {
$('#num').text(data);
}
})
}
然后在 HTML:
中重复使用它两次
<a href="#" onclick="updateCount(1);">1</a>
<a href="#" onclick="updateCount(2);">2</a>
我创建了一个演示项目,其中我有两个名为“1”和“2”的 link,并显示数字 1 或 2,具体取决于单击哪个 link。
models.py
class Count(models.Model):
num = models.IntegerField(default=0)
urls.py
urlpatterns = [
url(r'^home/$', views.home, name='home'),
url(r'^count/(?P<pk>\d+)/$', views.count, name='count'),
]
views.py
def home(request):
c = Count.objects.filter(id=1)
return render(request, "alpha/home.html", {'c': c})
def count(request, pk):
c = Count.objects.filter(id=1).update(num=pk)
return HttpResponseRedirect(reverse('alpha:home'))
home.html
<html>
<head>
<script type="text/javascript" src="jquery-2.1.4.min.js"></script>
</head>
<body>
{% for c in c %}
<span id="num"> {{ c.num }} </span>
{% endfor %}
<a href="#" onclick="$.ajax({
url: '{% url 'alpha:count' 1 %}',
success: function(data) {
$('#num').text({{ c.num }});
}
})">1</a>
<a href="{% url 'alpha:count' 2 %}">2</a>
</body>
</html>
如您所见,count
视图更新模型,然后重新加载 home
视图,从而刷新答案(即 1 或 2)。但是在模板文件中,我尝试包含 jQuery 库并尝试以页面不重新加载的方式调用第一个 link。我对 JS 了解很少,所以这基本上是 copy/paste 代码。现在单击第一个 link 不会执行任何操作。我做错了什么?
您的 count
视图应该 return 计算值而不是重定向:
def count(request, pk):
c = Count.objects.filter(id=1).update(num=pk)
return new HttpResponse(pk)
您的 AJAX 调用应根据服务器的响应更新 span
的值:
$.ajax({
url: '{% url 'alpha:count' 1 %}',
success: function(data) {
$('#num').text(data);
}
})
此外,我会将 AJAX 提取到一个函数中,例如:
function updateCount(value){
$.ajax({
url: '/count/' + value,
success: function(data) {
$('#num').text(data);
}
})
}
然后在 HTML:
中重复使用它两次<a href="#" onclick="updateCount(1);">1</a>
<a href="#" onclick="updateCount(2);">2</a>