Как преобразовать уже существующий 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