DetailView中的分页[Django]

问题描述

我的模型中有Article和ArticleCategory。文章有很多类别。

模型

class ArticleCategory(Created):
    category_name = models.CharField(max_length=128)
    slug = models.SlugField(null=False,unique=False)

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

    def __str__(self):
        return self.category_name

class Article(Created):
    title = models.CharField(max_length=120)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    snippet = models.TextField(null=False)  # ustawić max_lenght
    body = RichTextField(null=False)
    category = models.ManyToManyField(ArticleCategory,related_name='articles')  # Todo: ustawić on_delete
    image = models.ImageField(blank=True,null=True,upload_to='article_image/')
    slug = models.SlugField(null=False,**kwargs):  
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args,**kwargs)

    def get_absolute_url(self):
        return reverse('news:article_detail',kwargs={'pk': self.pk,'slug': self.slug})

此外,我对所有具有该类别的文章都具有特定类别的网址:

URL

urlpatterns = [
    path('show/<int:pk>/<slug:slug>',ArticleDetailView.as_view(),name='article_detail'),path('all/',AllArticlesListView.as_view(),name='all_articles_list'),path('category/<slug:slug>/',CategoryArticlesList.as_view(),name='category_articles_list'),]

在我创建的 VIEW

class CategoryArticlesList(DetailView):
    template_name = 'news/category_articles_list.html'
    model = ArticleCategory

最后是模板CATEGORY_ARTICLES_LIST.HTML

SPECIFIC CATEGORY: {{ articlecategory.category_name | upper }}

AND ALL NEWS WITH THIS CATEGORY
{% for article in articlecategory.articles.iterator reversed %}
    <h3>{{ article.title }}</h3> <br>
    {{ article.body | safe }} <br>
{% endfor %}

我的问题是...如何对视图中的所有特定类别文章进行分页? 如果我在CategoryTypeArticlesList类中使用ListView,则查询形式的问题将会很大……我不知道该怎么办。

解决方法

DetailView不会进行分页,因为很可能只有一个对象。您可以将其设置为ListView,并添加一些逻辑以传递articlecategory

from django.shortcuts import get_object_or_404

class ArticlesByCategoryListView(ListView):
    template_name = 'news/category_articles_list.html'
    model = Article
    queryset = Article.objects.order_by('-pk')
    paginate_by = 25

    def get_queryset(self,*args,**kwargs):
        return super().get_queryset(*args,**kwargs).filter(
            category__slug=self.kwargs['slug']
        )

    def articlecategory(self):
        return get_object_or_404(ArticleCategory,slug=self.kwargs['slug'])

然后在模板中,我们可以使用以下方式呈现该信息:

SPECIFIC CATEGORY: {{ view.articlecategory.category_name|upper }}

AND ALL NEWS WITH THIS CATEGORY
{% for article in page_obj %}
    <h3>{{ article.title }}</h3> <br>
    {{ article.body|safe }} <br>
{% endfor %}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...