Python / Django фильтрация постов по категориям - PullRequest
0 голосов
/ 23 марта 2020

Попытка отфильтровать сообщения с помощью тега привязки в шаблоне

<a href="{% url 'post_list' %}?school=SchoolA&category=CategoryA">GO to POSTS</a>

URL-адрес выше http://127.0.0.1:8000/post/?school=SchoolA&category=CategoryA

По некоторым причинам это не работает и показывает все сообщения независимо от их категории.

def post_list(request):
    school_slug = request.GET.get('school')
    category_slug = request.GET.get('category')

    posts = VideoPost.objects.all()

    if school_slug:
        posts.filter(school=school_slug)

    if category_slug:
        posts.filter(category=category_slug)

    posts = posts.order_by('-date_posted')

    return render(request, 'stories/browse.html', {'posts': posts})

Это работает как-то, но я не могу фильтровать сообщения только по одному из них.

def post_list(request):
    school_slug = request.GET.get('school')
    category_slug = request.GET.get('category')

    posts = VideoPost.objects.all().filter(school=school_slug).filter(category=category_slug).order_by('-date_posted')

    return render(request, 'stories/browse.html', {'posts': posts})

Кажется как будто есть какая-то проблема с утверждением if, которое я принимаю, но я не смог понять.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

.filter(...) не изменяет вызываемый набор запросов, но возвращает новый. Таким образом, вы должны переназначить результат. Измените

posts.filter(school=school_slug)
#  ...
posts.filter(category=category_slug)

на

posts = posts.filter(school=school_slug)
#  ...
posts = posts.filter(category=category_slug)

, как вы делали это с предложением .order_by.

0 голосов
/ 23 марта 2020

В фрагменте 1:

    if school_slug:
        posts.filter(school=school_slug)

    if category_slug:
        posts.filter(category=category_slug)

Это не изменяет posts objects, так как filter не изменяет исходный набор запросов. Чтобы исправить это, сделайте следующее:

    if school_slug:
        posts = posts.filter(school=school_slug)

    if category_slug:
        posts = posts.filter(category=category_slug)

или

В Sinppet 2:

posts = VideoPost.objects.all().filter(school=school_slug).filter(category=category_slug).order_by('-date_posted')

В основном вы выполняете category_slug and school_slug в указанном выше наборе запросов. Для достижения school_slug or category_slug используйте Q Filter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...