Как преобразовать это представление на основе функций category_detail в CBV (DetailView) - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть это функциональное представление, делающее то, что мне нужно - получить список всех сообщений, поданных с указанием категории c, и перейти к этому списку, перейдя по адресу example.com/economics/ (где экономика - это slug od, который указывает c Категория). Там я найду список всех своих сообщений, поданных в категории «Экономика», и создам ссылки, чтобы я мог щелкнуть по ним и go на одной странице сообщения.

В настоящее время мой FBV выглядит следующим образом:

def category_detail(request, category_detail_slug=None):
    categories = Category.objects.all()
    #Show only published posts
    posts = Post.objects.filter(status__exact='1')
    if category_detail_slug:
        category = get_object_or_404(Category, slug=category_detail_slug)
        posts = posts.filter(category=category)
    return render(request, 'blog/category/single.html', {'category_detail_slug': category_detail_slug,
                                                         'category': category,
                                                         'categories': categories,
                                                         'posts': posts})

Я начал создавать свой CBV следующим образом:

class CategoryDetailView(DetailView):
    model = Category
    template_name = 'blog/category/single.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

Я знаю, что мне нужно передать некоторый контекст, но почему-то мне это не удается.

Мой URL для этого определяется так:

path('<slug:category_detail_slug>/', views.CategoryDetailView.as_view(), name="single_category")

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Я думаю, что получил - мне нужно вернуть категорию как self.object, чтобы все это выглядело так:

class CategoryDetailView(DetailView):
    model = Category
    slug_url_kwarg = 'category_detail_slug'
    template_name = 'blog/category/single.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        posts = Post.objects.filter(status__exact='1')
        category = self.object
        context['posts'] = posts.filter(category=category)
        return context

Но вы очень помогли, и я отмечу ваш ответ как ответ!

0 голосов
/ 26 апреля 2020

Вы можете сделать это следующим образом

class CategoryDetailView(DetailView):
    model = Category
    slug_url_kwarg = 'category_detail_slug'
    template_name = 'blog/category/single.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        posts = Post.objects.filter(status__exact='1')
        context['posts'] = posts.filter(category=category)
        return context
...