python - 使用 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 %} 语句下方显示所有项目,它们只能按标题过滤。
解决方案
首先,我认为最好将cat.pk
as 值用于选项:
<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)
推荐阅读
- javascript - Angular6:如何从另一个组件打开模式
- ruby-on-rails - 非无头测试期间 Chrome 中的文本不可见
- reactjs - 如何将组件的 ownProps 传递给 reduxForm?
- javascript - 使用 Javascript 中的 api 调用获取图像 url 到 HTML 中的图像标签?
- kendo-ui - 菜单的 Kend UI 模板
- wordpress - 如何使用 Wordpress 文件系统方法读取 php 输入流?
- mongodb - 如何从集合中的所有文档中删除特定的子文档?
- html - css不适用于div
- dotnetnuke - 将 Google Tag Manager 与 DNN 结合使用时,无法使用结构数据测试工具检测架构代码
- ios - 框架更改时不重绘 UIView 背景颜色(在动态扩展的 TableViewCell 中)