Django Slice 无法处理 zip

Django Slice isn't working on a zip

我最近一直在修改 Django 和 Python,在尝试限制我的代码中的 for 循环时,我注意到 slice 函数不起作用。

我想做的是从一个演出列表网站上抓取数据(我有权限),并在我自己的网站上列出接下来的 5 个演出列表。 views.py 中的数据抓取工作正常,但 returns ~40 个结果。我已经尝试使用 |slice:":5" 到 trim 我的 HTML 中的 for 循环,但它似乎不起作用,并且仍然显示所有 40 个列表。

是否可以将切片与数组压缩一起使用?有更好的方法吗?

HTML

{% for dates, venuelinks, venues, times in gig|slice:":5" %}
    <ul>
        <li>{{dates}}</li>
        <li><a href="{{venuelinks}}">{{venues}}</a></li>
        <li>{{times}}</li>
    </ul>
{% endfor %}

Views.py方法

response = requests.get($URL) #anonymised for Whosebug
soup = bs4.BeautifulSoup(response.text, "html.parser")

dates = [x.text for x in soup.select('$CONDITION')]
venues = [x.text for x in soup.select('$CONDITION')]
venuelinks = [x.attrs.get('href') for x in soup.select('$CONDITION')]
times = [x.text for x in soup.select('$CONDITION')]     
gigs = zip(dates, venuelinks, venues, times)

t = loader.get_template('index.html')
html = t.render({'gig': gigs})  
return HttpResponse(html)

如果您使用的是 python3,则您无法分割拉链。您可以尝试将 zip 转换为列表:

>>> gigs = list(zip(dates, venuelinks, venues, times))

但这会破坏切片的许多目的,比如首先不生成大量数据。但是,由于您已经在创建列表,我想这对您来说不是什么大问题。

对 zip 对象使用切片会引发 TypeError。在这种情况下 slice 模板过滤器静默失败并且 returns 初始值 https://github.com/django/django/blob/master/django/template/defaultfilters.py#L622-L623 .

另一种选择可能是直接对原始列表进行切片:

response = requests.get($URL) #anonymised for Whosebug
soup = bs4.BeautifulSoup(response.text, "html.parser")

dates = [x.text for x in soup.select('$CONDITION')]
venues = [x.text for x in soup.select('$CONDITION')]
venuelinks = [x.attrs.get('href') for x in soup.select('$CONDITION')]
times = [x.text for x in soup.select('$CONDITION')]
gigs = zip(dates[:5], venuelinks[:5], venues[:5], times[:5])

t = loader.get_template('index.html')
html = t.render({'gig': gigs})  
return HttpResponse(html)

请参阅@f43d65 的回答以获取解释,为什么您当前的设置失败"silently"...并考虑在模板中执行尽可能少的操作,并在视图函数中执行大部分脏活。