在我的html中,有一个包含所有注释的div。我需要限制要显示的评论数量。所以,我创建了一个包含标签:
<div class="past_comments">
{% limit_amount_in_a_page page_nr=page_nr topic_id=topic.id amount=4 %}
</div>
@register.inclusion_tag('post/comment_block.html')
def limit_amount_in_a_page(page_nr, topic_id=1, amount=5):
topic = get_object_or_404(Topic, id=topic_id)
comments = Comment.objects.filter(topic=topic)
selected_comments = []
starting_index = page_nr*amount
for index in range(starting_index, starting_index + amount):
if index >= len(comments):
break;
selected_comments.append(comments[index])
return {
'topic': topic,
'page_nr': int(page_nr),
'selected_comments': selected_comments,
'amount_comments': comments.all().count(),
'limit_amount_comment': amount,
}
因此,此标记显示来自comment_block.html
的代码{% load static %}
{% load post_tags %}
{% load post_filters %}
{% for comment in selected_comments %}
<div class="comment_body">
<div class="user_info_block">
<div class="content">
<div class="photo_profile"></div>
<div class="user_info"></div>
</div>
</div>
<div class="content_block">
<p>{{comment.content}}</p>
</div>
</div>
{% endfor %}
topic id is {{topic.id}}
page nr is {{page_nr}}<br>
comment amount is {{amount_comments}}<br>
limit amount is {{limit_amount_comment}}<br>
{% if page_nr != 0 %}
<a href="{% url 'post:detail' topic.id page_nr|increase:-1 %}">Previous Page</a>
{% endif %}
{%page_not_over_amount page_nr amount_comments limit_amount_comment%}
{% if comment_not_over_amount %}
<a href="{% url 'post:detail' topic.id page_nr|increase:1 %}">Next Page</a>
{% endif %}
正如您所看到的,在显示所有评论后,我创建了另一个标记 page_not_over_amount ,如果所有评论都已显示,则隐藏指向下一页的链接
@register.inclusion_tag('post/comment_block.html')
def page_not_over_amount(page_nr, comment_amount, comment_limit):
result = page_nr * comment_limit < comment_amount - comment_limit
return {'comment_not_over_amount': result}
但是,我发现我的标签 page_not_over_amount 没有准备好来自comment_block.html的任何变量(在我得到异常之后,我检查了局部变量。所有值都是&#34 ;&#34)。 我想这可能的原因是两个标签都重定向到相同的html文件。在第二个标记重定向后,它会刷新页面中的所有变量。
我应该调用上下文变量吗?
答案 0 :(得分:2)
好的,所以看起来你正在寻找一个基本的分页计划。首先,您应该查看Django中的built-in solution。你一定要花一个小时试试这项工作。
Django是一个重量级的框架,它有一个内置的方式来处理大多数事情,以及其他所有的库。作为一般规则,如果你发现自己以复杂的方式完成一项共同任务,那么可能就是那里的股票解决方案。
如果您决定以快速而肮脏的方式进行,那么如何计算has_next_page
中的has_prev_page
和limit_amount_in_a_page
呢?
@register.inclusion_tag('post/comment_block.html')
def limit_amount_in_a_page(page_nr, topic_id=1, amount=5):
topic = get_object_or_404(Topic, id=topic_id)
comments = Comment.objects.filter(topic=topic)
num_comments = comments.count()
selected_comments = comments[page_nr*amount, (page_nr + 1)*amount]
has_prev = (page_nr != 0)
has_next = ((page_nr + 1) * amount) < num_comments
return {
'topic': topic,
'page_nr': int(page_nr),
'selected_comments': selected_comments,
'has_next' : has_next,
'has_prev' : has_prev,
'amount_comments' : num_comments,
}
另外,请注意使用切片选择评论。
但同样,我强烈建议您查看Django中的Paginator类。如果还没有,阅读文档并完成教程也是一件好事。浏览所有文档可以让您了解内置的内容,从长远来看可以节省大量时间。