Показать записи в блогах, соответствующие текущей категории

Я хочу фильтровать свою базу данных на основе menuItem или категории постов моего блога. С помощью self.request.path я получаю что-то вроде '/py/', что представляет одну из моих категорий.

Сейчас я делаю так, и это отлично работает, но есть ли лучший способ? Должен ли я создать для каждой категории отдельное приложение и написать для него свой IndexView с фиксированным фильтром queryset? Если есть лучшее решение моей проблемы, я буду рад узнать :)

Here my CategoryIndexView:

class CategoryIndexView(ListView):
    model = Post
    template_name = 'blog/category_index.html'
    # context_object_name = 'category'

    def get_queryset(self):
        category = self.request.path[1:-1]
        if category.lower() == 'ml':
            query_set = Post.objects.filter(category=0)
        elif category.lower() == 'py':
            query_set = Post.objects.filter(category=1)
        elif category.lower() == 'kt':  
            query_set = Post.objects.filter(category=2) 
        elif category.lower() == 'cpp':
            query_set = Post.objects.filter(category=3)
        else: 
            query_set = Post.objects.filter(category=0)
        return query_set

Вот фрагмент моих urlpatterns:

urlpatterns = [
    path('about/', genViews.about, name='about'),
    path('imprint/', genViews.imprint, name='imprint'),
    path('admin/', admin.site.urls),
    path('',genViews.HomeView.as_view(), name='home'), 
    path('ml/',blogViews.CategoryIndexView.as_view(), name='machine_learning'),
    path('py/',blogViews.CategoryIndexView.as_view(), name='python'),
    path('kt/',blogViews.CategoryIndexView.as_view(), name='android'),
    path('cpp/',blogViews.CategoryIndexView.as_view(), name='cpp')
]

Есть лучший способ, попробуйте добавить параметр в url, например, так:

urls.py

...
    path("posts/<category>/", views.posts, name="posts"),
...

views.py

def posts(request, category):
    query_set = Post.objects.filter(category=0)
    ...  

Да, есть более эффективный способ добиться этого. Я бы предложил использовать только одно представление для обработки и filter queryset на основе category, на котором щелкнули. Например:

urls.py

urlpatterns = [
     # other URLs 
     path('categories/<str:category>/',blogViews.CategoryIndexView.as_view(), name='categories'),
     
     # [ <str:category> ] accepting the category the user clicks on to filter the database 
]

views.py

class CategoryIndexView(ListView):
     model = Post
     template_name = 'blog/category_index.html'
     # context_object_name = 'category'

     def get_queryset(self):
         # Using kwargs.get() to capture the category passed via the url
         category = self.kwargs.get('category', None)  

         queryset = Post.objects.filter(category__iexact=category)

         # If your category field is a FK field then use 
         # queryset = Post.objects.filter(category__name__iexact=category)

         return queryset 
Вернуться на верх