2

私のIDE(PyCharm)は報告を続けます:関数ベースの汎用ビューは非推奨になりました。

インポートリストに次のステートメントがあります。

from django.views.generic.list_detail import object_list

そして、私の見解は次のようになります。

def category(request, id, slug=None):
    category = Category.objects.get(pk=id)

    books = Book.objects.filter(
        Q(status = 1) & Q(category=category)
    ).order_by('-id')

    s = Poet.objects.order_by('?')[:3]

    return object_list(
        request,
        template_name = 'books/categories/show.html',
        queryset = books,
        paginate_by = 99,
        extra_context = {
            'category': category,
            'suggestions': s,
            'bucket_name': config.BOOKS_BUCKET_NAME,
            }
    )

私はこれをSOで見つけましたが、ドキュメントはこの点で非常に複雑に見えます。

コードを変換する方法に関するヒントをいただければ幸いです。

4

1 に答える 1

2

あなたはこのようなことを試すことができます

from django.views.generic import ListView

class CategoryView(ListView):
    template_name = 'books/categories/show.html'
    paginate_by = 99

    def get_queryset(self):
        self.category = Category.objects.get(pk=self.kwargs['id'])

        books = Book.objects.filter(
           Q(status = 1) & Q(category=self.category)
        ).order_by('-id')

        self.s = Poet.objects.order_by('?')[:3]

        return books

    def get_context_data(self, **kwargs):
        context = super(CategoryView, self).get_context_data(**kwargs)
        context['category'] = self.category
        context['suggestions'] = self.s
        return context

このコードはテストされていません。機能している場合は報告してください。ブックリストは、コンテキスト変数'object_list'を介して利用できることに注意してください。別の名前を付けたい場合は、'context_object_name'クラスメンバーを使用できます。

class CategoryView(ListView):
    template_name = 'books/categories/show.html'
    context_object_name = 'books'
    ...

urls.pyで、クラスベースのビューのas_view()メソッドを使用します

url( r'your pattern', CategoryView.as_view(), name='whatever')
于 2012-12-27T03:21:09.653 に答える