【发布时间】:2020-10-03 15:04:12
【问题描述】:
我有一个 django 项目,我正在尝试将自定义“在线”状态添加到(模型中的布尔字段)。我想定期刷新一个 div 以显示用户现在是否在线。刷新的 div 类为 button-refresh,位于包含的 HTML 文件中。
问题是包含不适用于原始 HTML 文件中的 for 循环,没有从服务器检索到任何“专业”数据。我对 django 很陌生,我的假设是 refresh_professionals.html 文件是通过 ajax 请求检索的,并且与 all_professionals.html 完全分开,然后包含在内,而不是 for 循环的一部分,这意味着 @987654322 @ 语法不起作用。
关于如何解决此问题的任何想法?如果有更好的方法可以做到这一点,请告诉我。谢谢。
all_professionals.html
{% for professional in professionals %}
...
{{ professional.name }}
{% include 'professionals/refresh_professionals.html' %}
...
{% endfor %}
...
{% block postloadjs %}
{{ block.super }}
<script>var global_url = "{% url 'refresh_professionals' %}";</script>
<script src="{% static 'professionals/js/professionals.js' %}"></script>
{% endblock %}
refresh_professionals.html
<div class="col button-refresh">
{% if professional.professional_profile.online is True %}
<p class="custom-button mb-1 w-25 mx-auto">Chat</p>
{% else %}
<p class="custom-button-disabled mb-1 w-25 mx-auto">Unavailable</p>
{% endif %}
<p>{{ professional.price_chat }}/min</p>
</div>
professionals.js
$(document).ready(function(){
setInterval(function() {
$.ajax({
url: global_url,
type: 'GET',
success: function(data) {
$('.button-refresh').html(data);
}
});
}, 5000)
});
urls.py
urlpatterns = [
path('', views.view_all_professionals, name='view_all_professionals'),
path('refresh/', views.refresh_professionals, name='refresh_professionals'),
]
views.py
def view_all_professionals(request):
"""A view to return the professionals page"""
professionals = Professional.objects.all()
languages = Languages.objects.all()
context = {
'professionals': professionals,
'languages': languages,
}
return render(request, 'professionals/all_professionals.html', context)
def refresh_professionals(request):
"""A view to refresh the online button section"""
professionals = Professional.objects.all()
context = {
'professionals': professionals,
}
return render(request, 'professionals/refresh_professionals.html', context)
编辑
我听从了 Daniel 的建议,现在返回一个 JSON 对象。这是更新的代码
professionals.js
$(document).ready(function(){
setInterval(function() {
$.ajax({
url: global_url,
type: 'GET',
success: update_professionals,
});
}, 5000)
});
function update_professionals(response){
// unpack the response (context) from our view function:
var professionals = response.professionals;
// update html:
var i;
for (i = 0; i < professionals.length; i++) {
$('#professional-name' + i).text('professionals.name' + i);
};
};
views.py
def refresh_professionals(request):
"""A view to refresh the professionals section page"""
professionals = Professional.objects.all()
professionals = serializers.serialize("json", professionals)
context = json.dumps({
'professionals': professionals,
})
return HttpResponse(context)
我现在面临的问题是参考专业数据。它返回未捕获的错误。 forloop 是必要的,因为在我的 HTML 中,我使用 django forloop.counter 获得了一系列带有数字的 ID。任何意见,将不胜感激。谢谢。
【问题讨论】:
-
你快到了 - 与其尝试使用 refresh_professionals 方法呈现模板,不如返回数据的 json 对象。然后,在 js 中,您可以使用 refresh_professionals ajax 调用返回的数据更新 html 元素。
-
@Daniel 我不完全确定你修改我的 JS 是什么意思,我对 Ajax 非常缺乏经验。我已经改变了我的看法,看起来像这样 ``` def refresh_professionals(request): professional = Professional.objects.all().values() professional_list = list(professionals) return JsonResponse(professionals_list, safe=False) ```但不确定如何修改我上面提供的 JS。
-
在下面查看我的答案。我很乐意详细说明任何不清楚的地方。
-
您好,您正在从后端返回 json,您需要使用
$.parseJSON(response);解析它或将dataType: 'json'提供给您的 ajax。
标签: javascript python jquery django ajax