我想使用python django框架列出属于一个类别的所有帖子。
我认为最好的方法是使用django.views.generic.ListView
我的模特:
class Category(models.Model):
name = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, blank=True)
def __str__(self):
return self.name
def get_absolute_url(self):
kwargs = {
'slug': self.slug
}
return reverse('category-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
value = self.name
self.slug = slugify(value, allow_unicode=True)
super().save(*args, **kwargs)
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
我的网址模式:
urlpatterns = [
path('', PostListView.as_view(), name='blog-home'),
path('category/<str:slug>/', CategoryListView.as_view(), name='category-detail'),
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail')
]
我的观点:
class CategoryListView(ListView):
paginate_by = 8
template_name = 'blog/category_list.html'
context_object_name = 'posts'
def get_queryset(self):
return Post.objects.filter(category_id=Category.objects.filter(slug=self.kwargs.get('slug')).first().id).all()
这对我有用。但是,这似乎并不是最优雅的方法,因为我必须先获取category_id,然后再过滤帖子。
有没有更优雅的方法?
答案 0 :(得分:0)
你能做
public boolean checkExceptionClass(Throwable cause){
return (cause instanceof firstException
|| cause instanceof secondException
|| cause instanceof iDontHaveThatClassException // can't do that
|| cause instanceof fourthException);
}
假设posts = Category.objects.get(slug=self.kwargs.get('slug')).post_set.all()
字段是唯一的。
文档描述了倒退效果: https://docs.djangoproject.com/en/1.11/topics/db/queries/#following-relationships-backward
使用您的slug
方法,可能值得在使用kwargs时采取一些防御措施:
get_queryset()
这样,如果将错误的子句传递到url中,它将返回404而不是def get_querset(self):
category = get_object_or_404(Category, slug=self.kwargs.get('slug'))
return category.post_set.all()
异常。