Django-使用AJAX来;溪流;带有注释的查询集的结果
因此,我正在加载模型字段中存在的每个值的计数。一切正常,但每次对数据库进行更改时,我都必须重新启动服务器,以使更改在前端生效Django-使用AJAX来;溪流;带有注释的查询集的结果,ajax,django,django-views,Ajax,Django,Django Views,因此,我正在加载模型字段中存在的每个值的计数。一切正常,但每次对数据库进行更改时,我都必须重新启动服务器,以使更改在前端生效 class ToggleFavouriteSignalView(View): def post(self, request, *args, **kwargs): obj_id = kwargs['signal_id'] try: model_obj = CanBusLogAnalyzer.objects.g
class ToggleFavouriteSignalView(View):
def post(self, request, *args, **kwargs):
obj_id = kwargs['signal_id']
try:
model_obj = CanBusLogAnalyzer.objects.get(id=obj_id)
new_val = False if model_obj.favourite else True
model_obj.favourite = new_val
model_obj.save()
response_text = 'Success:Signal setted as favourite.' if new_val else 'Info:Signal removed as favourite.'
return HttpResponse(response_text, status=200)
except CanBusLogAnalyzer.DoesNotExist:
return HttpResponse('Error:The object no longer exists in the database.', status=503)
except Exception:
return HttpResponse('Error:Please check your internet connection.', status=503)
我认为AJAX可能适合这种情况,但我不知道怎么做。还要注意的是,在我的查询中,我有在模板中使用的注释
我的意见如下:
def counts(request):
duplicates = Application.objects.all().filter(is_qualified="awarded").values('school_name').annotate(name_count=Count('school_name'))
context = {
'repeated_names' : records,
'duplicates' : duplicates,
'title' : 'Disbursement Details',
}
return render(request, 'calculations/list.html', context)
我的网址如下:
path('list/', default_views.counts, name='count_rows'),
最后,我的模板是:
<table class="table table-hover" id="disbursement_table">
<thead class=" wow fadeInLeft">
<tr>
<th>#</th>
<th>School</th>
<th>Number of Applicants</th>
</tr>
</thead>
<tbody class=" wow fadeInRight" wow-data-duration="2s">
{% for application in duplicates %}
<tr class="clickabe-row" data-target="{% url 'dup_detail' application.school_name %}">
<td>{{ forloop.counter}}</td>
<td>{{ application.school_name}}</td>
<td>{{ application.name_count }}</td>
</tr>
{% endfor %}
</tbody>
</table>
#
学校
申请人数
{%用于重复的应用程序%}
{{forloop.counter}
{{申请.学校名称}
{{application.name_count}
{%endfor%}
是否有一种方法可以使用AJAX在每次数据库发生更改时定期更新
{{application.name\u count}}
值?我认为您有两种选择:
- ,这是本机Django功能,将允许您知道数据何时保存到模型中
- 然后,您只需要在javascript端实现Websocket通信,这相对简单
@receiver(post_save, sender=CanBusAnalyzerJob, dispatch_uid='update_job_status_listeners')
def update_job_status_listeners(sender, instance, **kwargs):
'''
Sends job status to the browser when a Job is modified
'''
job_id = instance.job_id
group_name = 'new-job-' + job_id
message = {
'total': instance.job_total,
'progress': instance.progress,
'status': instance.status
}
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'send_job_progress',
'text': message
}
)
测试websocket连接的JS代码
<script>
var socket = new WebSocket('ws://' + window.location.host + '/ws/');
socket.onopen = function() {
console.log("Websocket connection done!");
if (socket.readyState == WebSocket.OPEN) {
setInterval(function() {
socket.send('Hello World');
}, 10000);
}
};
socket.onmessage = function(e) {
var data = JSON.parse(e.data);
var message = data['message'];
console.log(data);
};
socket.onclose = function(e) {
console.error('Chat socket closed unexpectedly');
};
</script>
JS代码
//For authentication purposes
function getCrsfCookie() {
var cookieValue = null,
name = 'csrftoken';
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
//Runs every 5 seconds
setInterval(function() {
var csrfcookie = getCrsfCookie();
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 503) {
alert("Error when trying to toggle favourite!")
}
};
url_arr = window.location.href.split("/")
base_url = url_arr[0] + "//" + url_arr[2]
var params = 'signal_id=' + signal_id;
xhttp.open('POST', base_url + destination_url, true);
xhttp.setRequestHeader('X-CSRFToken', csrfcookie);
xhttp.send(params);
}, 5000);
//用于身份验证
函数getCrsfCookie(){
var cookieValue=null,
名称='csrftoken';
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i