我创建了一个搜索栏,该搜索栏根据产品名称进行搜索。我现在想将其更改为按类别搜索,但是我发现很难。这是我的网址文件:'''
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.marketplaceHome, name='marketplace-home'),
url(r'^search/$', views.search, name='search'),
url(r'^contact/$', views.Contact, name='contact'),
url(r'^(?P<category_slug>[-\w]+)/(?P<product_slug>[-\w]+)/$', views.productPage, name='product_detail'),
url(r'^(?P<category_slug>[-\w]+)/$', views.marketplaceHome, name='products_by_category'),
url('^cart$', views.cart_detail, name='cart_detail'),
url(r'^cart/add/(?P<product_id>[-\w]+)/$', views.add_cart, name='add_cart'),
url(r'^cart/remove/(?P<product_id>[-\w]+)/$', views.cart_remove, name='cart_remove'),
url(r'^cart/remove_product/(?P<product_id>[-\w]+)/$', views.cart_remove_product, name='cart_remove_product'),
]
'''views.py'''
from __future__ import unicode_literals
from django.shortcuts import render, get_object_or_404, redirect
from .models import Category, Product, Cart, CartItem
from django.core.exceptions import ObjectDoesNotExist
from . import forms
# Create your views here.
def marketplaceHome(request, category_slug=None):
category_page = None
products = None
if category_slug !=None:
category_page = get_object_or_404(Category, slug=category_slug)
products = Product.objects.filter(category=category_page, available=True)
else:
products = Product.objects.all().filter(available=True)
return render(request, 'marketplacehome.html', {'category': category_page, 'products': products})
def productPage(request, category_slug, product_slug):
try:
product = Product.objects.get(category__slug=category_slug, slug=product_slug)
except Exception as e:
raise e
return render(request, 'product.html', {'product': product})
def search(request):
products = Product.objects.filter(name__contains=request.GET['name'])
return render(request, 'marketplacehome.html', { 'products': products})
'''template.html'''
<ul class="navbar-nav ml-auto">
<form class="form-inline" action="{% url 'search' %}", method="GET">
<div class="input-group">
<input type="text" name="name" class="form-control" placeholder="Location" aria-label="Search" name="query">
<div class="input-group-append">
<button type="button" class="btn btn-warning" name="button"><i class="fas fa-search"></i></button>
</div>
</div>
'''models.py'''
class Category(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def get_url(self):
return reverse('products_by_category', args=[self.slug])
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
image = models.ImageField(upload_to="product", blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
single_price = models.DecimalField(max_digits=10, decimal_places=2)
twelve_lesson_price = models.DecimalField(max_digits=10, decimal_places=2)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
available = models.BooleanField(default=True)
class Meta:
ordering = ('name',)
verbose_name = 'product'
verbose_name_plural = 'products'
def get_url(self):
return reverse('product_detail', args=[self.category.slug, self.slug])
def __str__ (self):
return self.name
'''
此结构成功返回了按名称搜索的产品,但是当我将其更改为类别时,它不起作用。任何帮助将不胜感激。
您可以使用:
def search(request):
products = Product.objects.filter(category__name__icontains=request.GET['name'])
return render(request, 'marketplacehome.html', { 'products': products})
因此,您在此处搜索对象的name
的category
是否包含给定的request.GET['name']
。
您可以使用__icontains
区分大小写in,或__contains
区分大小写。