Фильтрация контента по категориям (поле «многие ко многим») с использованием django - PullRequest
1 голос
/ 10 февраля 2020

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

models.py

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

  def __str__(self):
    return self.name

class Item(models.Model):
  title = models.CharField(max_length=100)
  price = models.FloatField()
  discount_price = models.FloatField(blank=True, null=True)
  category = models.ManyToManyField(Category)
  label = models.CharField(choices=LABEL_CHOICES, max_length=1)
  slug = models.SlugField()
  description = models.TextField()
  image = models.ImageField()

views.py

def HomeView(request):
  item_list = Item.objects.all()
  category_list = Category.objects.all()
  query = request.GET.get('q')
  if query:
    item_list = Item.objects.filter(title__icontains=query)

  paginator = Paginator(item_list, 10)
  page = request.GET.get('page')

  try:
      items = paginator.page(page)
  except PageNotAnInteger:
      items = paginator.page(1)
  except EmptyPage:
      items = paginator.page(paginator.num_pages)

  context = {
      'items': items,
      'category': category_list
  }
return render(request, "home.html", context)

home . html

<form method="GET" action=".">
        <div class="form-group col-md-4">
            <label for="category">Category</label>
            <select id="cat" class="form-control" name="cat">
                <option selected>Choose...</option>
                {% for cat in category %}
                <option value="{{ cat }}">{{ cat }}</option>
                {% endfor %}
            </select>

        </div>
        <button type="submit" class="btn btn-primary">Search</button>
    </form>

В настоящее время на странице отображаются категории в списке, а под выражением {% для элемента в элементах%} отображается все элементы, и их можно фильтровать только по заголовку.

1 Ответ

1 голос
/ 10 февраля 2020

Прежде всего, я думаю, что лучше использовать cat.pk в качестве значения для опции:

<option value="{{ cat<b>.pk</b> }}">{{ cat }}</option>

Теперь мы можем фильтровать и по категории:

def HomeView(request):
    item_list = Item.objects.all()
    category_list = Category.objects.all()
    query = request.GET.get('q')
    if query:
        item_list = item_list.filter(title__icontains=query)

    cat = request.GET.get('cat')
    if cat:
        item_list = item_list.<b>filter(category__pk=cat)</b>

    paginator = Paginator(item_list, 10)
    page = request.GET.get('page')

    try:
        items = paginator.page(page)
    except PageNotAnInteger:
        items = paginator.page(1)
    except EmptyPage:
        items = paginator.page(paginator.num_pages)

    context = {
        'items': items,
        'category': category_list
    }
    return render(request, "home.html", context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...