Django - 包含标记

时间:2017-11-07 19:46:24

标签: python django tags

在我的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文件。在第二个标记重定向后,它会刷新页面中的所有变量。

我应该调用上下文变量吗?

1 个答案:

答案 0 :(得分:2)

好的,所以看起来你正在寻找一个基本的分页计划。首先,您应该查看Django中的built-in solution。你一定要花一个小时试试这项工作。

Django是一个重量级的框架,它有一个内置的方式来处理大多数事情,以及其他所有的库。作为一般规则,如果你发现自己以复杂的方式完成一项共同任务,那么可能就是那里的股票解决方案。

如果您决定以快速而肮脏的方式进行,那么如何计算has_next_page中的has_prev_pagelimit_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类。如果还没有,阅读文档并完成教程也是一件好事。浏览所有文档可以让您了解内置的内容,从长远来看可以节省大量时间。