class IndexView(ListView):
    """
    Представление для просмотра списка статей. Представление реализовано с
    использованием generic-представления ListView.

    В представлении активирована пагинация и реализован поиск
    """
    template_name = 'articles/index.html'
    model = Article
    context_object_name = 'articles'
    ordering = ('title', '-created_at')
    paginate_by = 5
    paginate_orphans = 1

    def get(self, request, **kwargs):
        self.form = SearchForm(request.GET)
        self.search_data = self.get_search_data()
        return super(IndexView, self).get(request, **kwargs)
    
    def get_queryset(self):
        queryset = super().get_queryset()

        if self.search_data:
            queryset = queryset.filter(
                Q(title__icontains=self.search_data) |
                Q(author__icontains=self.search_data) |
                Q(content__icontains=self.search_data)
            )
        return queryset

    def get_search_data(self):
        if self.form.is_valid():
            return self.form.cleaned_data['search_value']
        return None
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['search_form'] = self.form
        user = self.request.user
        i = []
        for i in ArticleLike.objects.filter(id=self.kwargs.get('id')):
            i.append(i.article.id)
        context['like_id'] = i
        liked_articles = []
        if self.request.user.is_authenticated:
            ddd = ArticleLike.objects.filter(author=self.request.user)
            for d in ddd:
                liked_articles.append(d.article.pk)
        context['liked_articles'] = liked_articles
        if self.search_data:
            context['query'] = urlencode({'search_value': self.search_data})

        return context
Esempio n. 2
0
 def get(self, request, **kwargs):
     self.form = SearchForm(request.GET)
     self.search_data = self.get_search_data()
     return super(IndexView, self).get(request, **kwargs)