DetailView 中的分页 [Django]
Pagination in DetailView [Django]
我的模型中有文章和文章类别。文章有很多分类。
型号
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, unique=False)
def save(self, *args, **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 到特定类别的所有文章:
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 %}
我的问题是...如何为视图中的所有特定类别文章制作分页?
如果我在 class CategoryArticlesList 中使用 ListView,我的查询就会出现大问题...我不知道我应该做什么。
A DetailView
不进行分页,因为只有一个对象。但是,您可以将其设为 ListView
并添加一些逻辑来传递 articlecategory
:
from django.shortcuts import get_object_or_404
class ArticlesByCategoryListView(<b>ListView</b>):
template_name = 'news/category_articles_list.html'
model = Article
queryset = Article.objects.order_by('-pk')
<b>paginate_by = 25</b>
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
category__slug=self.kwargs['slug']
)
def <b>articlecategory</b>(self):
return get_object_or_404(ArticleCategory, slug=self.kwargs['slug'])
然后在模板中,我们可以渲染它:
SPECIFIC CATEGORY: {{ <b>view.articlecategory.</b>category_name|upper }}
AND ALL NEWS WITH THIS CATEGORY
{% for article in <b>page_obj</b> %}
<h3>{{ article.title }}</h3> <br>
{{ article.body|safe }} <br>
{% endfor %}
我的模型中有文章和文章类别。文章有很多分类。
型号
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, unique=False)
def save(self, *args, **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 到特定类别的所有文章:
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 %}
我的问题是...如何为视图中的所有特定类别文章制作分页? 如果我在 class CategoryArticlesList 中使用 ListView,我的查询就会出现大问题...我不知道我应该做什么。
A DetailView
不进行分页,因为只有一个对象。但是,您可以将其设为 ListView
并添加一些逻辑来传递 articlecategory
:
from django.shortcuts import get_object_or_404
class ArticlesByCategoryListView(<b>ListView</b>):
template_name = 'news/category_articles_list.html'
model = Article
queryset = Article.objects.order_by('-pk')
<b>paginate_by = 25</b>
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
category__slug=self.kwargs['slug']
)
def <b>articlecategory</b>(self):
return get_object_or_404(ArticleCategory, slug=self.kwargs['slug'])
然后在模板中,我们可以渲染它:
SPECIFIC CATEGORY: {{ <b>view.articlecategory.</b>category_name|upper }}
AND ALL NEWS WITH THIS CATEGORY
{% for article in <b>page_obj</b> %}
<h3>{{ article.title }}</h3> <br>
{{ article.body|safe }} <br>
{% endfor %}