【问题标题】:Refresh a div in Django using JQuery and AJAX - Django ForLoop Issues使用 JQuery 和 AJAX 在 Django 中刷新 div - Django ForLoop 问题
【发布时间】: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


【解决方案1】:

好的,假设我们有一个像这样的视图函数:

from django.http import HttpResponse
import json

def refresh_professionals(request):

    """A view to refresh the online button section"""

    professionals = Professional.objects.all()

    # convert to json friendly format:
    professionals = ... 

    context = json.dumps({
        'professionals': professionals,
    })

    return HttpResponse(context)

这假设专业人员现在看起来像这样(实际结构显然会有所不同):

professionals = {"id":1, "name":"Jason"}

现在,在我们的 js 文件中,我们应该有一个像这样的 ajax 请求(包装在 setInterval 方法等中):

$.ajax({
    url: global_url,
    type: 'GET',
    success: update_professionals, // reference to an ajax-success function
 });

我们的成功函数是这样的:

update_professionals(response) {
    
    // unpack the response (context) from our view function:
    // use JSON.parse() to convert a string to json
    var professionals = JSON.parse(response.professionals); 

    // update html:
    $('#professional-name').text(professionals.name)
}

假设我们有一个这样的 HTML 元素:

<div id="professionals-name"> Sue </div>

不同之处在于我们使用 js 即时更新 HTML,而不是尝试重新渲染 HTML 模板,这可能需要刷新页面。

【讨论】:

  • 很好的建议,我比以前走得更远了。我收到了预期的 JSON 响应,但我无法正确替换 HTML。我收到一个未捕获的 TypeError,它无法读取 ....text(professionals.name);有任何想法吗?我会用我当前的代码更新我原来的帖子。
  • 你能分享你的专业 json 吗?你可以在js中做console.log(response.professionals)
  • 抱歉耽搁了。这是我的专业人士 json 的 sn-p。感谢所有的帮助。 {"professionals": "[{\"model\": \"professionals.professional\", \"pk\": 1, \"fields\": {\"name\": \"professional14\", \"description\": \"testtest12345\", \"rating\": 5, \"image\": \"DP0119201620405230C_HjI6YVE.jpg\", \"video\": \"aswdawdawd\", \"professional_profile\": 2}}, {\"model\": \"professionals.professional\", \"pk\": 2, \"fields\": {\"name\": \"professional2\"}}]"}
  • 但是,那是使用 console.log(response)。如果我这样做 console.log(response.professionals) 我得到未定义。
  • 太好了——因为你使用了 django-serializer 来“jsonify”你的对象,你需要解析传入的 json——请参阅上面我编辑的答案。然后,您需要根据需要从 json 中获取数据 - 您可以使用 django-serializers 重构专业 json 的一些选项 - 或者您可以编写自己的简单序列化程序。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 2017-11-16
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2014-05-19
  • 2010-12-05
  • 2012-05-10
相关资源
最近更新 更多