Показать записи в блогах, соответствующие текущей категории
Я хочу фильтровать свою базу данных на основе 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