首页 > 解决方案 > 使用 django 按类别(多对多字段)过滤内容

问题描述

我想使用类别过滤我网站上的项目。我已经设法按标题进行过滤,但我不确定这个。

模型.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()

视图.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)

主页.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>

目前该页面在列表中显示类别,在 {% for item in items %} 语句下方显示所有项目,它们只能按标题过滤。

标签: pythondjango

解决方案


首先,我认为最好将cat.pkas 值用于选项:

<option value="{{ cat.pk }}">{{ 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.filter(category__pk=cat)

    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)

推荐阅读