Итак, у меня есть простая модель, которая называется Pages. Каждая страница принадлежит определенной категории, поскольку это отношение ForeignKey, страница может принадлежать только одной категории.
Помимо категорий, мы также используем теги для дополнительной фильтрации различных страниц.
Мы используем представление категорий для отображения всех страниц, принадлежащих к определенной категории, easy peasy.
Дело в том, что мы используем django -фильтры для фильтрации страниц, выбирая различные теги. Список тегов увеличивается на количество страниц. Поэтому я хотел бы показывать только связанные теги для категории.
urls.py
path('<slug:category_slug>/', views.PageByCategoryView.as_view(), name='page_by_category'),
views.py
class PageByCategoryView(FilterView):
logger.info("Category view is called")
model = Page
filterset_class = PageByCategoryFilter
strict = False
queryset = Page.published_objects.all()
template_name = 'pages/page_by_category.html'
filters.py
class PageByCategoryFilter(django_filters.FilterSet):
tags = django_filters.ModelMultipleChoiceFilter(
queryset=Tag.objects.filter(page__category_id='2'), <-- actually works!
conjoined=True,
widget=forms.CheckboxSelectMultiple()
)
class Meta:
model = Page
fields = [
'tags__slug'
]
Таким образом, теги, используемые в фильтре, на самом деле фильтруются по page__category_id = 2, это именно то, чего я хочу достичь, хотя я хочу сделать это динамически. Я пытался определить qs следующим образом:
@property
def qs(self):
queryset = super(PageByCategoryFilter, self).qs
current_category = self.request.GET.get('category_slug')
if current_category:
logger.info("Current category is in url")
return queryset.filter(category__slug=current_category)
return queryset
Это просто не работает, как я могу получить current_category из URL?
Хорошо, что я сделал ниже на самом деле работает, но выглядит вроде хаки sh .. У кого-нибудь есть лучший ответ по решению этой проблемы?
def category_filter(request):
path = request.path
category_slug = re.sub('\/+', r'', path)
current_category = category_slug
return Tag.objects.filter(page__category__slug=current_category).distinct()
С наилучшими пожеланиями,
Кевин