簡體   English   中英

使用python為帖子數量添加最大限制

[英]Adding a maximum limit to the number of post using python

我需要限制 Django 查詢中的帖子數量。 我試圖添加一個最小值和最大值,但似乎沒有任何效果。 我已將 home.html 添加到代碼中。

示例:我的博客中應該只有 15 篇最新的帖子。 其余的可以通過單擊類別按鈕來查看。

主頁.html:

{% extends 'base.html' %}

{% block content %}




<h1>Posts</h1>

<ul>
{% for post in object_list %}

    <li><a href="{% url 'article-detail' post.pk %}">{{post.title}}</a> 
<style>
    a {
        text-transform: capitalize;
    }
</style>
        - <a href="{% url 'category' post.category %}">{{ post.category }}</a> - <a href="{% url 'show_profile_page' post.author.profile.id %}">{{ post.author.first_name }} 
    {{ post.author.last_name }}</a> - {{ post.post_date }} <small>

        {% if user.is_authenticated %}
            {% if user.id == post.author.id %}

            - <a href="{% url 'update_post' post.pk %}">(Edit)</a>

            <a href="{% url 'delete_post' post.pk %}">(Delete)</a>
            {% elif user.id == 1 %}

            - <a href="{% url 'update_post' post.pk %}">(Edit)</a>

            <a href="{% url 'delete_post' post.pk %}">(Delete)</a>

            {% endif %}

        {% endif %}


    </small><br/>
    {{ post.snippet }}</li>
{% endfor %}
</ul>


{% endblock %}

view.py:

class HomeView(ListView):
    model = Post
    template_name = 'home.html'
    ordering = ['-id']

    def get_context_data(self, *args, **kwargs):
            cat_menu = Category.objects.all()
            context = super(HomeView, self).get_context_data(*args,**kwargs)
            context["cat_menu"] = cat_menu
            return context

模型.py:

class Post(models.Model):
    title = models.CharField(max_length=255)
    header_image = models.ImageField(null=True, blank=True, upload_to='images/')
    title_tag = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = RichTextField(blank=True, null=True)
    post_date = models.DateField(auto_now_add=True)
    category = models.CharField(max_length=255, default='intro')
    snippet = models.CharField(max_length=255)
    likes = models.ManyToManyField(User, related_name='post_likes')
    dislikes = models.ManyToManyField(User, related_name='post_dislikes')

我認為當您單擊類別按鈕時,您有另一個用於顯示分類對象的模板。 如你所說

“我的博客中應該只有 15 篇最新的帖子。其余的可以通過單擊類別按鈕查看。”

在這種情況下,您可以使用簡單的 hack 來顯示表格中的最新帖子。 views中按降序查詢所有對象

    all_objs = Post.objects.all().order_by('-id')

然后使用{% if forloop.counter <= 15 %}僅顯示最后 15 個項目。 如下。

模板

{% for post in object_list %}

   {% if forloop.counter <= 15 %}

       <h4>{{obj}} #or anything really that is meant to be shown on the home page.</h4>

   {% endif %}

{% endfor %}

你可以這樣做:

def get_context_data(self, *args, **kwargs):
    context = super(HomeView, self).get_context_data(*args,**kwargs)
    context["cat_menu"] = Category.objects.all()
    context["most_recent_posts"] = Post.objects.filter(author=self.request.user).order_by('-post_date')[:15]
    return context  

這將獲得由當前用戶創作的 15 個最新帖子,按發布日期排序。

然后只需處理在home.html顯示它,例如:

<ul>
{% for p in most_recent_posts %}
    <li>{{ p.title }}</li>
{% endfor %}
</ul>

只需將您的查詢限制為按post_date排序的最新 15 個條目:

cat_menu = Category.objects.latest("post_date")[:15]

https://docs.djangoproject.com/en/3.2/topics/pagination/

最好的方法是 Django 分頁。

{% for contact in page_obj %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br>
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>
from django.core.paginator import Paginator
from django.shortcuts import render

from myapp.models import Contact

def listing(request):
    contact_list = Contact.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page.

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'list.html', {'page_obj': page_obj})

您可以使用 Django 分頁 api 。 通過頁碼管理您的數據。 最初通過 1 和分頁給出的頁碼之后。

 paginator = Paginator(yourquerysetdata, 20)
        page_num = request.data.get('page')
        result = yourSerializerName(paginator.get_page(page_num) many=True).data
        try:
            page = paginator.page(page_num)
        except:
            page = paginator.page(1)

        count = paginator.num_pages

        resultobj = paginator.get_page(page_num)
        has_prev = resultobj.has_previous()
        has_next = resultobj.has_next()
        page_range = resultobj.paginator.page_range.stop - 1
        if has_prev:
            prev_page_no = resultobj.previous_page_number()
        else:
            prev_page_no = 0

        if has_next:
            next_page_no = resultobj.next_page_number()
        else:
            next_page_no = None

        context = dict()
        context['page'] = page.number
        context['page_no'] = count

這很簡單。 您只需要修改用於獲取帖子的查詢。
get_context_data()方法中,替換cat_menu = Category.objects.all()
cat_menu = Category.objects.all().order_by('-post_date')[:15] 這會將結果數量限制為 15 個最近的對象。 如需更多了解,您可以查看 Django 官方文檔中的Limiting QuerySets

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM