【问题标题】:Reload table data in Django without refreshing the page在 Django 中重新加载表数据而不刷新页面
【发布时间】:2016-04-18 20:48:32
【问题描述】:

在我的视图中获取数据的代码如下所示:

order = Order.objects.filter(owner=request.user).order_by('-id')[:10]

我的模板中的代码看起来像这样并且运行良好。现在,问题是我希望这个表每 10 秒更新一次信息,而不刷新整个页面。视图的 url 是 /,模板的名称是 home。

           <table class="table table-striped table-condensed">
              <tr>
                <th>Reg.nr.</th>
                <th>M&auml;rke</th>
                <th>Modell</th>
              </tr>
              {% for i in order %}

                {% if i.order_booked %}
                <tr class="success">
                {% else %}
                <tr>                    
                {% endif %}

                 <td>{{ i.regnr|upper }}</td>
                 <td>{{ i.brand|capfirst }}</td>
                 <td>{{ i.brand_model|capfirst }}</td>
              </tr>
              {% endfor %}
            </table>

urls.py 看起来像这样

urlpatterns = [ url(r'^$',views.home, name='home'), url(r'^login/', auth_views.login, {'template_name':'login.html'}, name='account_login'), url(r'^logout/', auth_views.logout, {'template_name':'logout.html'},name='account_logout'), url(r'^add_order/', views.add_order, name='add_order'), url(r'^admin/', admin.site.urls), ]

你们中的任何人都可以对此有所了解吗?我将不胜感激!

【问题讨论】:

  • 您需要使用javascript。这是在不刷新页面的情况下更改 dom 对象的唯一方法。
  • 好的,我可以使用 javascript。但我不知道应该怎么做,我已经尝试了几十个脚本来尝试让它工作。你有任何使用 django 的 js 经验,现在如何完成它?如何在不刷新整个页面的情况下从视图中获取新数据?
  • 从 stackoverflow 找人为你写代码真的很难。像“django with javascript”这样的简单谷歌搜索会给你带来大量的结果。我只是随机挑选一个看起来很有前途的tangowithdjango.com/book/chapters/ajax.html

标签: jquery ajax django


【解决方案1】:

您可以使用setIntervaljQuery AJAXview

您的 HTML

   <table id="_appendHere" class="table table-striped table-condensed">
      <tr>
        <th>Reg.nr.</th>
        <th>M&auml;rke</th>
        <th>Modell</th>
      </tr>
      {% for i in order %}
        {% if i.order_booked %}
        <tr class="success">
        {% else %}
        <tr>                    
        {% endif %}

         <td>{{ i.regnr|upper }}</td>
         <td>{{ i.brand|capfirst }}</td>
         <td>{{ i.brand_model|capfirst }}</td>
      </tr>
      {% endfor %}
    </table>

JS

<script>
    var append_increment = 0;
    setInterval(function() {
        $.ajax({
            type: "GET",
            url: {% url 'get_more_tables' %},  // URL to your view that serves new info
            data: {'append_increment': append_increment}
        })
        .done(function(response) {
            $('#_appendHere').append(response);
            append_increment += 10;
        });
    }, 10000)
</script>

查看

def get_more_tables(request):
    increment = int(request.GET['append_increment'])
    increment_to = increment + 10
    order = Order.objects.filter(owner=request.user).order_by('-id')[increment:increment_to]
    return render(request, 'get_more_tables.html', {'order': order})

get_more_tables.html

  {% for i in order %}
  <tr>
    {% if i.order_booked %}
    <tr class="success">
    {% else %}
    <tr>                    
    {% endif %}

     <td>{{ i.regnr|upper }}</td>
     <td>{{ i.brand|capfirst }}</td>
     <td>{{ i.brand_model|capfirst }}</td>
  </tr>
  {% endfor %}

然后确保将新视图添加到您的urls.py (确保它具有name='get_more_tables',或您的JS 中的任何名称url:

它的作用是使用setInterval,一个 JS 函数,每 10000 毫秒(10 秒)向服务器中的视图发出一个 GET AJAX 请求。然后,视图使用这个新上下文呈现一个单独的 HTML 文件,并将其作为 response 发送回您的原始 HTML 页面。然后通过 jQuery 将新的 response appended 添加到您的表中。每次发生此循环时,切片都会递增,因此您不会从 Order 获得相同的结果。

请记住,这将不断循环,因此如果您希望它结束​​,则必须向 JS 添加代码以在最后一个响应返回为空时停止 setInterval

【讨论】:

  • 感谢您的回答,我会试试看。它让我更好地理解需要什么。非常感谢。
  • 没问题,如果解决方案适合你,请务必点击我答案左侧的绿色“复选”标记,以便需要帮助的人知道答案
  • 把你当前的urls.py放到你原来的帖子里,我会加进去的
  • 感谢 Hybrid 代码,现在它就像一个魅力。你真的让我很开心,我花了很多时间来解决这个问题。
猜你喜欢
  • 2021-01-07
  • 2017-09-20
  • 2021-12-23
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多