【问题标题】:How to pass 2 arguments to def get_queryset?如何将 2 个参数传递给 def get_queryset?
【发布时间】:2021-09-02 12:54:57
【问题描述】:

晚上好,我在学习 Django 时遇到问题。重点是我在做一个培训新闻网站,有“公开”这样一个项目——新闻是否发布。并且要仅显示已发布的新闻,请使用“def get_queryset” 但我只需要使用 public = True 和新闻创建日期显示新闻

views.py

class news(ListView):
model = Post
template_name = 'flatpages/new.html'
context_object_name = 'news'
# paginate_by = 6

ordering = '-data'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['cate'] = Category.objects.all()
    return context

def get_queryset(self):
    return Post.objects.filter(public=True)

models.py

class Category(models.Model):
category_name = models.CharField(max_length=64, unique=True)
subscribers = models.ManyToManyField(User, blank=True, null=True)


class Meta:
    verbose_name = 'Категория'
    verbose_name_plural = 'Категории'

def __str__(self):
    return self.category_name

class Post(models.Model):
PostAuthor = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='Автор поста')

PostNews = 'PN'
PostArticle = 'PA'

# «статья» или «новость»
POSITIONS = [
    (PostArticle, 'Статья'),
    (PostNews, 'Новость'),
]

postCategory = models.ManyToManyField(Category, verbose_name='Категория поста',  through='PostCategory')
title = models.CharField(max_length=50, verbose_name='Название')
positions = models.CharField(max_length=2, choices=POSITIONS, default=PostArticle, verbose_name='Тип поста')
category_id = models.ForeignKey(Category, verbose_name='Категория', null=True, on_delete=models.CASCADE, related_name='category_id')
data = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
data_update = models.DateTimeField(auto_now=True, verbose_name='Дата редактирования')
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото', blank=True, default='/photos/def/1.jpg/')
previewName = models.CharField(max_length=128, verbose_name='Превью поста')
text = models.TextField(verbose_name='Текст поста')
rating = models.SmallIntegerField(default=0, verbose_name='Рейтинг')
public = models.BooleanField(default=True, verbose_name='Опубликовано')

def like(self):
    self.rating +=1
    self.save()

def dislike(self):
    self.rating -=1
    self.save()

def preview(self):
    return self.text[0:124] + '...'

def __str__(self):
    return self.title

class Meta:
    verbose_name = 'Пост'
    verbose_name_plural = 'Посты'

def get_absolute_url(self):
    return f'/news/{self.pk}'

html 页面

        <div class="col-md-8">
        {%for el in news%}
        <div class="card mb-3">
            <div class="card-header">
                Категории: {{el.category_id}}
            </div>
            <br>
            <div class="row g-0">
                <div class="col-md-4">
                    {%if el.photo%}
                    <img src="{{el.photo.url}}" alt="" width="275" class="mr-3">
                    {%endif%}
                </div>
                <div class="col-md-8">
                    <div class="card-body">
                        <h5 class="card-title"><a style="color: #000000;" href="{% url 'news_detail' el.id %}">{{ el.title|censor_filter }}</a></h5>
                        <p class="card-text">{{ el.text|censor_filter|truncatewords:150 }}</p> <a
                            href="{% url 'news_detail' el.id %}" class="btn btn-primary">Читать полную новость</a>
                    </div>
                </div>
                <br>
                <div
                        class="card-footer text-muted " style="text-align: right;">Рейтинг статьи: {{el.rating}}<br>
                    Дата публикации {{ el.data|date:'d M Y H:m' }}
                </div>
            </div>
        </div>
        {%endfor%}
    </div>

https://i.stack.imgur.com/BG56m.png

【问题讨论】:

  • 创建日期是什么意思?这应该只返回当天发布的新闻,还是最近三天发布的新闻?
  • 这样他就可以按新闻的创建日期排序

标签: python html django django-views


【解决方案1】:

如果你覆盖get_queryset,Django 将不再对查询集进行排序,因为这是在视图的基本实现中实现的。您应该在.get_queryset 方法中订购:

class news(ListView):
    model = Post
    template_name = 'flatpages/new.html'
    context_object_name = 'news'
    # paginate_by = 6

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['cate'] = Category.objects.all()
        return context
    
    def get_queryset(self):
        #                          use order_by(…) &downarrow;
        return Post.objects.filter(public=True).order_by('-data')

注意:在 Django 中,基于类的视图 (CBV) 通常具有 …View 后缀,以避免与模型名称发生冲突。 因此,您可以考虑将视图类重命名为 NewsView,而不是 news

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2017-04-21
    • 2018-04-13
    • 2011-06-16
    相关资源
    最近更新 更多