Python Django列出属于一个类别的所有帖子

时间:2019-09-04 12:42:35

标签: python django listview detailview

我想使用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,然后再过滤帖子。

有没有更优雅的方法?

1 个答案:

答案 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() 异常。