Фильтровать сообщения по категории - PullRequest
2 голосов
/ 28 октября 2019

Я новичок в django и вообще в программировании. А сейчас я пишу свой первый проект - это будет мой личный блог, он почти готов, за исключением одной функции: у меня есть список категорий, показанный на странице в правой панели.

1) Вопрос в том, как я могу сортировать / фильтровать свои сообщения по этим категориям? Я имею в виду, что я хочу нажать на одну из этих категорий в правой панели и увидеть сообщения, в которых упоминается эта категория (возможно, в сообщении несколько категорий).

Я перепробовал много комбинаций, которые нашлив стеке, но я не делал этого раньше, поэтому не могу понять, как реализовать эту функцию в моем проекте.

models.py

class Category(models.Model):
    title = models.CharField(max_length=20)

    def __str__(self):
        return self.title


class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    content = HTMLField('Content')
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    thumbnail = models.ImageField()
    categories = models.ManyToManyField(Category)
    featured = models.BooleanField()
    previous_post = models.ForeignKey('self', related_name='previous', on_delete=models.SET_NULL, blank=True, null=True)
    next_post = models.ForeignKey('self', related_name='next', on_delete=models.SET_NULL, blank=True, null=True)

    def __str__(self):
        return self.title

views.py

def filter_by_category(request):
    post_list = Post.objects.filter(categories=)
    context = {
        'post_list': post_list
    }
    return render(request, 'post_by_category.html', context)

urls.py

urlpatterns = [
   path('admin/', admin.site.urls),
   path('', index),
   path('blog/', blog, name='post-list'),
   path('search/', search, name='search'),
   path('blog/filter_by_category/', filter_by_category, name='filter_by_category'),
   path('subscribe/', email_list_signup, name='subscribe'),
   path('create/', post_create, name='post-create'),
   path('post/<id>/', post, name='post-detail'),
   path('post/<id>/update/', post_update, name='post-update'),
   path('post/<id>/delete/', post_delete, name='post-delete'),
   path('tinymce/', include('tinymce.urls')),
   path('accounts/', include('allauth.urls')),

sidebar.html

<div class="widget categories">
    <header>
      <h3 class="h6">Categories</h3>
    </header>
    {% for cat in category_count %}
    <div class="item d-flex justify-content-between">
      <a href="{% url 'filter_by_category' %}">{{ cat.categories__title }}</a><span>{{ cat.categories__title__count }}</span></div>
    {% endfor %}
  </div>

Данный код не работает, я знаю, что проблема в views.py. Я совершенно запутался, как правильно написать. Помогите, пожалуйста, решить эту проблему.

ОБНОВЛЕНО: Решено, большое спасибо Landcross. Я был близок в этом моменте к этому решению, но все испортил. Спасибо!

1 Ответ

2 голосов
/ 28 октября 2019

Во-первых, разверните определение URL следующим образом:

path('blog/filter_by_category/<str:category>', filter_by_category, name='filter_by_category'),

Теперь вы определяете переменную с именем 'category' (которая является строкой, отсюда и str) в URL-адресе, которую можно передать вview:

def filter_by_category(request, category):
    post_list = Post.objects.filter(categories__title=category)
    context = {
        'post_list': post_list
    }
    return render(request, 'post_by_category.html', context)

И измените свой шаблон, добавив в URL параметр:

<div class="widget categories">
    <header>
      <h3 class="h6">Categories</h3>
    </header>
    {% for cat in category_count %}
    <div class="item d-flex justify-content-between">
      <a href="{% url 'filter_by_category' category=cat.categories__title %}">{{ cat.categories__title }}</a><span>{{ cat.categories__title__count }}</span></div>
    {% endfor %}
  </div>

Вы также можете изменить URL-адрес на int и изменить свой шаблон на использование идентификатора категории. вместо заголовка, если это то, что вам больше нравится или работает лучше для вас (например, если заголовки категорий могут содержать дубликаты).

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