diff --git a/news/urls.py b/news/urls.py new file mode 100644 index 0000000..5b37fbf --- /dev/null +++ b/news/urls.py @@ -0,0 +1,14 @@ +from django.urls import path + +from .views import CategoryList, NewsItemDetail, NewsItemList, TagList + +app_name = "news" + +urlpatterns = [ + path("", NewsItemList.as_view(), name="list"), + path("categories/", CategoryList.as_view(), name="categories"), + path("categories//", NewsItemList.as_view(), name="list_category"), + path("tags/", TagList.as_view(), name="tags"), + path("tags//", NewsItemList.as_view(), name="list_tag"), + path("//", NewsItemDetail.as_view(), name="detail"), +] diff --git a/news/views.py b/news/views.py index 91ea44a..ab950f5 100644 --- a/news/views.py +++ b/news/views.py @@ -1,3 +1,44 @@ -from django.shortcuts import render +from django.shortcuts import get_object_or_404 +from django.views.generic import DetailView, ListView -# Create your views here. +from .models import Category, NewsItem + + +class CategoryList(ListView): + model = Category + + +class NewsItemDetail(DetailView): + model = NewsItem + + +class NewsItemList(ListView): + category = None + tag = None + paginate_by = 6 + + def get_queryset(self): + category_slug = self.kwargs.get("category", None) + self.tag = self.kwargs.get("tag", None) + if category_slug: + self.category = get_object_or_404(Category, slug=category_slug) + return NewsItem.objects.filter(category=self.category).filter( + is_published=True + ) + elif self.tag: + return NewsItem.objects.filter(tags=self.tag).filter(is_published=True) + else: + return NewsItem.objects.filter(is_published=True) + + def get_context_data(self, *, object_list=None, **kwargs): + context = super(NewsItemList, self).get_context_data(**kwargs) + context["category"] = self.category + context["tag"] = self.tag + return context + + +class TagList(ListView): + template_name = "news/tag_list.html" + + def get_queryset(self): + return NewsItem.tags.tag_model.objects.all()