Как преобразовать уже существующий FBV в CBV в Django для начинающих

Привет всех с наступающим годом! Пожалуйста, ребята, извините меня, если этот вопрос покажется кому-то легким. Я только начал изучать Django в прошлом месяце. Так что я довольно новичок в том, как соединять вещи вместе. Я создал FBV под названием article_view, который на самом деле работает как ожидалось. Однако, по мере того как я продолжаю учиться, я понял, что у CBV есть волшебная вещь, которая не только сократит мою кодовую базу, но и будет содержать тонны методов, которые заставят меня жить дольше :). Поэтому я решил, что преобразование моего FBV в CBV будет правильным решением, а также использовать это для практики изучения Django.

Итак, я создал CBV под названием ArticleView и добавил некоторый контекст, но по какой-то причине я не могу понять, как полностью воспроизвести FBV в CBV.

Пожалуйста, я буду очень признателен, если кто-нибудь поможет мне с этим. Я мучаюсь с этим уже почти неделю, пытаясь разобраться самостоятельно, но безуспешно. Поэтому я пришел к выводу, что мне нужна помощь.

def article_view(request):
    articles = Article.objects.all().order_by('-published_on')
    this_page = request.GET.get("page", 1)

    pages = Paginator(articles, 5)

    try:
        page_obj = pages.page(this_page)
    except PageNotAnInteger:
        page_obj = pages.page(1)
    except EmptyPage:
        page_obj = pages.page(pages.num_pages)

    articles_list = []
    for article in page_obj:
        article_dict = {
            "form": ArticleForm(instance=article),
            "hunt_required_form": HuntRequiredForm(instance=article,
                                                   initial={"hunt_required": True,
                                                            "hunt_required_requestor": request.user}),
            "article": article,
            "read_by_user": article.read_by.filter(id=request.user.id).exists()
        }
        articles_list.append(article_dict)

    context = {
        'posts': articles_list,
        'title': 'Threat Articles',
        'unread_count': Article.objects.filter(~Q(read_by__id=request.user.id)).count(),
        'page_obj': page_obj,
        'hunt_req_count': Article.objects.filter(Q(hunt_required=True)).count()
    }
    return render(request, 'articles.html', context)


class ArticleView(LoginRequiredMixin, TemplateView):
    template_name = 'articles.html'
    extra_context = {'title': 'Threat Articles'}
    model = Article
    paginate_by = 5
    ordering = ['-published_on']

    def get_form_kwargs(self, *args, **kwargs):
        """ Passes the request object to the form class.
         This is necessary to only display members that belong to a given user"""

        kwargs = super(ArticleView, self).get_form_kwargs(*args, **kwargs)
        return kwargs

    def get_context_data(self, *args, **kwargs):
        context = super(ArticleView, self).get_context_data(*args, **kwargs)
        article = get_object_or_404(Article, pk=id)
        if self.request.user.is_authenticated:
            context['article'] = article
            context['form'] = ArticleForm(instance=article)
            context['hunt_required_form'] = HuntRequiredForm(instance=article, initial={"hunt_required": True,
                                                                                        "hunt_required_requestor": self.request.user})
            context['unread_count'] = Article.objects.filter(~Q(read_by__id=self.request.user.id)).order_by(
                '-published_on').count()
            context['now'] = timezone.now()
            context['hunt_req_count'] = Article.objects.filter(
                Q(hunt_required_requestor__id=self.request.user.id)).count()
        return context
Вернуться на верх