【问题标题】:Change the data in div periodically on django template在 django 模板上定期更改 div 中的数据
【发布时间】:2019-01-16 19:28:58
【问题描述】:

我想定期更改出现在我的页面上的 cmets(数据)。我在这里提到了一个问题,但数据没有改变,但它在页面刷新时发生了。

这是我在 views.py

中的代码
def index(request):
    count = Article.objects.all().count()
    comments = Article.objects.values_list('content')[randint(0, count - 1)][0]
    context = {
        'current_date': datetime.now(),
        'title': 'Home',
        'comments': comments,
    }
    return render(request, 'index.html', context)

还有 urls.py

urlpatterns = [
    url(r'^$', index, name='index'),
    url(r'^about/$',about),
    # url(r'^comments/$',ArticleCreateView.as_view(), name='comments'),
    url(r'^admin/', admin.site.urls),
]

还有index.html

<div>
    <div id="comments">
        {{ comments }}
    </div> 
</div>

<script>
    var ALARM_URL = "{% url 'index' %}";
    function refresh() {
        $.ajax({
            url: ALARM_URL,
            success: function(data) {
                $('#comments').html(data);
            }
        });
    };
    $(document).ready(function ($) {
        refresh();
        var int = setInterval("refresh()", 3000);
    });
  </script>

【问题讨论】:

  • ALARM_URL 返回什么?
  • @WillemVanOnsem 指向要执行的代码所在的方法。我从这里的答案中得到了这一点,我是使用 django 和 js 的新手,所以还不深入了解这些概念。

标签: javascript html ajax django


【解决方案1】:

您的视图index() 返回一个HTML 页面,因此参数data 包含整个HTML 页面。

您可能想要添加第二个仅返回 JSON 数据的视图,可能像这样:

views.py

def index_data(request):
    # here you return whatever data you need updated in your template
    return JsonResponse({
        'something_1': 0,
    })

urls.py

url(r'^data$', index_data, name='index-data'),

然后在你的 AJAX 调用中你做这样的事情:

url: "{% url 'index-data' %}",
success: function(data) {
    $('#comments').html(data['something_1']);
}

如果有帮助,请告诉我们。


编辑

您可能还需要调整计时器;将函数名传递给它,但不调用它,也不是作为字符串(参见the docs of setInterval):

$(document).ready(function ($) {
    refresh();
    setInterval(refresh, 3000);
});

【讨论】:

  • 所以我按照你的建议添加了一个新视图。之后,出现在我的 index.html 上的 cmets 消失了,现在在 /data url 上可见,这不是我想要做的。我希望 cmets 在 index.html 页面本身的 div 部分中刷新。
  • @Meg 我编辑了我的答案,包括对您的计时器的评论。也许这有帮助?
  • 我对代码进行了更改,但 cmets 并没有按照计时器进行更改。它仅在页面刷新时更改!
  • @Meg 您在浏览器控制台中看到了什么?来自javascript的任何错误或警告?如果在refresh() 方法中添加console.log('test refresh'); 行,浏览器控制台是否会打印任何内容?
  • 我做到了。我的 js 代码存在语法错误。非常感谢你的帮助。 cmets 已根据计时器开始更改。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2019-05-29
  • 2017-10-04
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多