python - 如何将 2 个参数传递给 def get_queryset?

标签 python html django django-views

晚上好,我在学习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>

/image/BG56m.png

最佳答案

如果您覆盖 get_queryset,Django 将不再对查询集进行排序,因为这是在 View 的基本实现中实现的。您应该在 .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(…) ↓
        return Post.objects.filter(public=True)<b>.order_by('-data')</b>

Note: In Django, class-based views (CBV) often have a …View suffix, to avoid a clash with the model names. Therefore you might consider renaming the view class to NewsView, instead of news.

关于python - 如何将 2 个参数传递给 def get_queryset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68024096/

相关文章:

php - 创建mysql数据库表的语法错误

python - 值错误 : invalid literal for int() with base 10: 'NULL'

javascript - 我已经在 python 中创建了一个列表,但是如何在 javascript 中迭代这个列表?

python - 我想知道 python 的 re lib 中正则表达式匹配的最后一个索引

python - 这是python的良好编码实践吗?

html - 基于ul li元素扩展div高度?

python - 如何从 Django 模型中为模型字段定义 json 类型

python - theano.tensor.nnet.conv.conv2d 的输出大小

python - 使用 pandas read_csv 时出现内存错误

javascript - eclipse 。添加文件而不将其复制到工作区