【问题标题】:Problems with get_gueryset method in DjangoDjango中get_queryset方法的问题
【发布时间】:2021-03-20 01:13:21
【问题描述】:

我在过滤查询集时遇到问题,过滤后应该分页,我正在使用 get_queryset 过滤对象的查询集,但在页面上没有显示任何内容。我有一个博客页面,我将所有帖子都放在一个列表中,并进行了分页,在页面上我有最常见的标签,每当我点击一个标签时,它都会重定向页面上的用户,其中包含具有该标签的帖子,我希望它们显示在列表中并像在初始页面中一样进行分页,但它不起作用。

我的看法:

class TaggedPostListView(ListView):
    model = Post
    template_name = 'blog/blog.html'
    context_object_name = 'posts'
    paginate_by = 2

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        tags = Post.tags.most_common()[:8]
        context['banner_page_title'] = 'Blog'
        context['page_location'] = 'home / blog'
        context['tags'] = tags
        return render(request, self.template_name, context)

    def get_context_data(self, **kwargs):
        context = {}
        return context

    def get_queryset(self):
        tag = get_object_or_404(Tag, slug=self.kwargs.get('slug'))
        return Post.objects.filter(tags=tag).order_by('-published_date')

型号:


class Post(models.Model):

    class PostCategory(models.TextChoices):
        FAMILY = 'FAMILY', _('Family')
        BUSINESS  = 'BUSINESS', _('Business')
        MWRKETING = 'MARKETING', _('Marketing')
        SPENDINGS = 'SPENDINGS', _('Spendings')

    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(_('Title'), max_length=200, unique=True)
    content = models.TextField(_('Content'))
    category = models.CharField(_('Category'), max_length=9, choices=PostCategory.choices, default=PostCategory.BUSINESS)
    slug = models.SlugField(_('Slug'), max_length=200, blank=True, null=False, unique=True)
    tags = TaggableManager(_('Tags'))
    published_date = models.DateTimeField(_('Published Date/Time'), auto_now_add=True)
    updated_date = models.DateTimeField(_('Updated Date/Time'), auto_now=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    @property
    def comments_count(self):
        return self.comments.count()

网址:

path('tag/<slug:slug>/', TaggedPostListView.as_view(), name='tag'),
{% extends 'home/base.html' %}
{% load static %}
{% block content %}
    <!--================Blog Area =================-->
    <section class="blog_area section-margin">
      <div class="container">
          <div class="row">
              <div class="col-lg-8 mb-5 mb-lg-0">
                  <div class="blog_left_sidebar">
                    {% for post in posts %}
                      <article class="blog_item">
                        <div class="blog_item_img">
                          <img class="card-img rounded-0" src="{% static 'img/blog/m-blog-1.jpg' %}" alt="Post Image">
                          <a href="{% url 'post' post.slug %}" class="blog_item_date">
                            <h3>{{ post.published_date|date:"d" }}</h3>
                            <p>{{ post.published_date|date:"M" }}</p>
                          </a>
                        </div>

                        <div class="blog_details">
                            <a class="d-inline-block" href="{% url 'post' post.slug %}">
                                <h2>{{ post.title }}</h2>
                            </a>
                            <p>{{ post.content|truncatechars:200 }}</p>
                            <ul class="blog-info-link">
                              <li><i class="ti-user"></i></li>
                              {% if post.comments_count %}
                              <li><i class="ti-comments"></i>{{ post.comments_count }} - Comments</li>
                              {% else %}
                                <li><i class="ti-comments"></i>0 Comments</li>
                              {% endif %}
                            </ul>
                        </div>
                      </article>
                    {% endfor %}
                    {% if is_paginated %}
                      <nav class="blog-pagination justify-content-center d-flex">
                        <ul class="pagination">
                        {% if page_obj.has_previous %}
                        <li class="page-item">
                            <a href="?page={{ page_obj.previous_page_number }}" class="page-link" aria-label="Previous">
                                <span aria-hidden="true">
                                    <span class="ti-arrow-left"></span>
                                </span>
                            </a>
                        </li>
                        {% endif %}

                        {% for num in page_obj.paginator.page_range %}
                            {% if page_obj.number == num %}
                            <li class="page-item active">
                                <a href="?page={{ num }}" class="page-link">{{ num }}</a>
                            </li>
                            {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
                            <li class="page-item">
                                <a href="?page={{ num }}" class="page-link">{{ num }}</a>
                            </li>
                            {% endif %}
                        {% endfor %}

                        {% if page_obj.has_next %}
                            <li class="page-item">
                                <a href="?page={{ page_obj.next_page_number }}" class="page-link" aria-label="Next">
                                    <span aria-hidden="true">
                                        <span class="ti-arrow-right"></span>
                                    </span>
                                </a>
                            </li>
                        {% endif %}
                        </ul>
                      </nav>
                    {% endif %}
                  </div>
              </div>
              <div class="col-lg-4">
                  <div class="blog_right_sidebar">
                      <aside class="single_sidebar_widget search_widget">
                          <form action="#">
                            <div class="form-group">
                              <div class="input-group mb-3">
                                <input type="text" class="form-control" placeholder="Search Keyword">
                                <div class="input-group-append">
                                  <button class="btn" type="button"><i class="ti-search"></i></button>
                                </div>
                              </div>
                            </div>
                            <button class="button rounded-0 w-100" type="submit">Search</button>
                          </form>
                      </aside>

                      <aside class="single_sidebar_widget post_category_widget">
                        <h4 class="widget_title">Category</h4>
                        <ul class="list cat-list">
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Resaurant food</p>
                                    <p>(37)</p>
                                </a>
                            </li>
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Travel news</p>
                                    <p>(10)</p>
                                </a>
                            </li>
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Modern technology</p>
                                    <p>(03)</p>
                                </a>
                            </li>
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Product</p>
                                    <p>(11)</p>
                                </a>
                            </li>
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Inspiration</p>
                                    <p>21</p>
                                </a>
                            </li>
                            <li>
                                <a href="#" class="d-flex">
                                    <p>Health Care (21)</p>
                                    <p>09</p>
                                </a>
                            </li>
                        </ul>
                      </aside>

                      <aside class="single_sidebar_widget popular_post_widget">
                          <h3 class="widget_title">Recent Post</h3>
                          {% for post in recent_posts %}
                            <div class="media post_item">
                              <img src="img/blog/popular-post/post1.jpg" alt="post">
                              <div class="media-body">
                                  <a href="single-blog.html">
                                      <h3>{{ post.title }}</h3>
                                  </a>
                                  <p>{{ post.date_posted|date:"F m, Y" }}</p>
                              </div>
                            </div>
                          {% endfor %}
                      </aside>
                      <aside class="single_sidebar_widget tag_cloud_widget">
                          <h4 class="widget_title">Post Tags</h4>
                          <ul class="list">
                              {% for tag in tags %}
                              <li>
                                  <a href="{% url 'tag' tag.slug %}">{{ tag }}</a>
                              </li>
                             {% endfor %}
                          </ul>
                      </aside>


                      <aside class="single_sidebar_widget instagram_feeds">
                        <h4 class="widget_title">Instagram Feeds</h4>
                        <ul class="instagram_row flex-wrap">
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i1.png" alt="">
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i2.png" alt="">
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i3.png" alt="">
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i4.png" alt="">
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i5.png" alt="">
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                  <img class="img-fluid" src="img/instagram/widget-i6.png" alt="">
                                </a>
                            </li>
                        </ul>
                      </aside>

                      <aside class="single_sidebar_widget newsletter_widget">
                        <h4 class="widget_title">Newsletter</h4>
                        <form action="" method="POST">
                          {% csrf_token %}
                          <div class="form-group">
                            <input type="email" class="form-control" name="newsletter_email" placeholder="Enter email" required>
                          </div>
                          <button class="button rounded-0 w-100" type="submit">Subscribe</button>
                        </form>
                      </aside>
                  </div>
              </div>
          </div>
      </div>
  </section>
  <!--================Blog Area =================-->
{% endblock %}

【问题讨论】:

  • 你如何渲染列表?
  • 我现在添加模板:D
  • 我已经添加了渲染

标签: python django pagination


【解决方案1】:

问题不在于get_queryset,问题在于get_context_data,本应生成包含上下文变量的字典的方法,因为您让它返回一个空字典而不再能正常工作。您只需覆盖它,然后将要传递的项目添加到模板:

class TaggedPostListView(ListView):
    model = Post
    template_name = 'blog/blog.html'
    context_object_name = 'posts'
    paginate_by = 2

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        tags = Post.tags.most_common()[:8]
        context['banner_page_title'] = 'Blog'
        context['page_location'] = 'home / blog'
        context['tags'] = tags
        return context

    def get_queryset(self):
        tag = get_object_or_404(Tag, slug=self.kwargs.get('slug'))
        return Post.objects.filter(tags=tag).order_by('-published_date')

在模板中,如果要分页,需要枚举page_obj,所以:

{% for post in page_obj %}
    # …
{% endfor %}

【讨论】:

  • 谢谢,现在它可以正常工作了,但是没有 {% for post in page_obj %}
  • 我是否应该更改帖子的枚举?
  • @ARYAN:它确实可以与posts 一起使用,但它通常不会分页,所以你会得到all @987654327 @s 用于该标记,而不是给定页面的两个。
  • 现在明白了:D
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2021-07-16
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2019-03-04
相关资源
最近更新 更多