在Django中,使用通用列表类,如何从相同的字段类型中获取对象_列表的N.

时间:2011-12-30 08:02:14

标签: django django-views

我有一个类似的模型,可以收集用户在书籍上选择的内容。

因此,每条记录都有user_id,like_id和book_id。

我想要一个类似的网址:

(?P<top_num>\d+)/likes/

将被引导到一个类似这样的视图:

class TopLikes(ListView):
    """ Get all the archived projects """

    queryset = Like.objects.filter(display=True)
    template_name = "books/TopLikes.html"
    paginate_by = 10

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(TopLikes, self).dispatch(*args, **kwargs)

我不知道的是如何将top_num作为传递给视图的数字,以返回最喜欢的前十本书。

我可以做queryset = Like.objects.filter(display=True).annotate(num_books=Count('books')).order_by('num_books')

之类的事情

对我来说,获取喜欢然后使用喜欢在模板中做这样的事情是有道理的:

{% for object in object_list  %}
    {{ object.book.title }} with {{ object|length }}
{% endfor %}

作为自定义视图,这会更容易吗?

由于

1 个答案:

答案 0 :(得分:3)

  1. 覆盖get_queryset()方法,以便您可以添加自定义过滤

  2. 使用self.kwargs ,以便您可以使用top_num url参数来限制查询集

  3. 使用{{object.num_books}} ,因为无论如何{{object | length}}应该做什么:)

  4. 示例:

    class TopLikes(ListView):
        """ Get all the archived projects """
    
        queryset = Like.objects.filter(display=True)
        template_name = "books/TopLikes.html"
        paginate_by = 10
    
        def get_queryset(self):
            qs = super(TopLikes, self).get_queryset()
            qs = qs.annotate(num_books=Count('books')).order_by('num_books')
            qs = qs[:self.kwargs['top_num']]
            return qs