繁体   English   中英

如何使Django模板从视图渲染一组结果并保持调用视图以获取更多结果而无需刷新页面

[英]How to make Django template render a set of results from views and keep calling view for more results without refreshing page

我正在制作一个Twitter应用程序,该应用程序基于搜索查询从twitter REST API提取推文。 现在,从这些结果中,我只想显示前端有2个以上转发的推文。 对于我的查询,每100条推文中只有几条满足此条件的推文。 因此,要显示100条这样的推文,其中有2条以上的转发,我必须处理5-10k条推文。 但是一个API调用最多可以获取100条推文。

现在,如果我在views.py获取5-10k条推文,对其进行处理,提取我需要的推文,然后将其作为上下文传递给django模板-(或者我只是将api结果按原样传递给模板并显示只有符合条件的推文),然后显然无法正常工作,因为用户无法等待站点加载,直到处理完所有推文为止。 通常会发生超时。

因此,有什么方法可以做到:

  1. 在视图中获取呼叫中的前100条推文。
  2. 渲染满足模板标准的推文(前端)
  3. 保持views.py在后台运行api调用并继续呈现满足模板上当前结果集以下条件的推文,而无需刷新页面。

我正在使用的Twitter库是Tweepy。

views.py

import tweepy
def index(request):
    try:
        query = 'qwerty'
        ###
        # Twitter Api authorization code here
        ###
        api = tweepy.API(auth)
        tweets = tweepy.Cursor(api.search, q=query, count=100).items(100)
        context = {'tweets': results,
                   'query':query,}
    except (KeyError):
        raise
    else:
        return render(request, 'tweets/index.html', context)
def index(request):

范本

{% for tweet in tweets %}
    {% if tweet.retweet_count >=2 %}
        //Display the tweets
        Tweet: {{ tweet.text }}
    {% endif %}
{% endfor %}

还是有一种方法可以动态地从Django模板本身进行呼叫? 但是,这是否会呈现结果并加载到目前为止获取的所有内容并在页面加载后进行rest调用,还是只是等待所有调用在页面完全加载之前进行?

由于您正在使用Twitter API,因此Deniz KAPLAN提供的答案在您的情况下不起作用。 Twitter不遵循分页过程。 当您要遍历的数据是固定的并且不保持更新时,分页很有用。

查看此链接 ,了解Twitter的时间轴如何工作。

无论如何,您需要做的是利用max_id变量。 max_id基本上是您获取的最后一条推文的ID。

因此,当您进行AJAX调用时,您应该发送的数据是max_id值。

...
data: {'max_id': 3, 'query': 'qwerty'} //Append additional data if required.
...

现在,请确保您具有另一个视图功能来处理您的AJAX请求。 该函数将看起来像这样。

from django.utils import simplejson
from django.http import HttpResponse

def ajax_tweets(request):
    if request.method == 'GET':
        max_id = int(request.GET['max_id'])
        query = request.GET['query']

        ###
        # Perform API auth requirements
        ###

        tweets = tweepy.Cursor(api.search, q=query, max_id=max_id, count=100).items(100)
        json = simplejson.dumps(tweets)

        return HttpResponse(json, mimetype="application/x-javascript")

现在,在AJAX调用的success函数中,浏览器将获取发送的JSON对象。 然后,您可以进行所需的更改。

...
success: function(data) {
     data = JSON.parse(data);
     //Perform DOM manipulations to append your tweets to your page
},
...

您可以根据需要在页面上显示的推文数量,根据条件在AJAX函数周围添加循环。

希望这种解释对您有所帮助。

您可以通过AJAX从模板调用此视图吗? 如果可以在AJAX中使用分页,则可以使用分页。 只需从ajax请求中获取两个参数(开始,结束)。 在模板中,您可以调用AJAX请求,如下所示:

$(document).ready(function(){
    $.ajax({
         type: "POST",
         url: '{% url "ajax-filter-tweets" %}',
         data: {'start':100, 'end':200},
         dataType: "json",
         success: function(data) {
         //append new tweets via js code here
         // at the end send another ajax if more tweets in queue
    },
    error: function(){
        //your error handling here
        }
    });
});

您可以将$ .ajax()函数发送到该视图的url,在成功部分,您可以调用带有起始索引和结束索引的新ajax函数。 您需要自定义过滤视图或为ajax请求生成一个新视图(从开始索引到结束索引结果过滤)。 您可以通过javascript设置ajax请求之间的超时。 您也可以使用“分页”关键字搜索此类问题。 分页示例可能会帮助您获取示例代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM