我是python和django的新手。我正在尝试创建一个购物网站。我有几个类别,每个类别都有子类别。在主页上,当我单击某个类别时,我想查看仅与该类别相关的子类别。目前,我正在查看所有子类别的列表(不仅仅是一个类别的子类别,而是所有子类别)。请指导我如何实现这一目标。
我的models.py如下:
from django.db.models import CASCADE
class Category(models.Model):
image = models.ImageField(upload_to='images/', blank=True)
name = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True, unique=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def get_absolute_url(self):
return '/category/{slug}/'.format(slug=self.slug)
def __str__(self):
return self.name
class Subcategory(models.Model):
category = models.ForeignKey(Category, related_name='subcategory', on_delete=CASCADE)
name = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True, unique=True)
class Meta:
ordering = ('name',)
verbose_name = 'subcategory'
verbose_name_plural = 'subcategories'
def __str__(self):
return self.name
我的admin.py如下:
from django.contrib import admin
from .models import Category, Subcategory
admin.site.register(Category)
class SubcategoryAdmin(admin.ModelAdmin):
list_display = ['__str__', 'slug']
prepopulated_fields = {'slug':('name',)}
class Meta:
model = Subcategory
admin.site.register(Subcategory, SubcategoryAdmin)
我的views.py如下:
from django.views.generic import ListView
from .models import Category, Subcategory
class CategoryListView(ListView):
queryset = Category.objects.all()
template_name = 'category/home.html'
class SubcategoryListView(ListView):
model = Subcategory
queryset = Subcategory.objects.filter(name='Jeans')
print(queryset)
template_name = 'category/detail.html'
在上面的代码中,我试图使用名为Jeans的子类别名称进行过滤。但是我想要的是当我单击类别说Men时,我的网址将显示localhost:8000 / category / Men 所以我想在“男人”类别下显示所有子类别。我不知道该怎么实现。
我的urls.py(主要)如下:
from django.contrib import admin
from django.urls import path, include
from category.views import CategoryListView
urlpatterns = [
path('admin/', admin.site.urls),
path('', CategoryListView.as_view()),
path('category/', CategoryListView.as_view()),
path('category/', include('category.urls')),
]
category / urls.py如下:
from django.conf.urls import url
from .views import SubcategoryListView
urlpatterns = [
url(r'^(?P<slug>[\w-]+)/$', SubcategoryListView.as_view()),
]
我的home.html如下:
{% for object in object_list %}
<a href="{{ object.get_absolute_url }}">{{ object.name }}</a></br>
{% endfor %}
我的detail.html如下:
{% for object in object_list %}
<a href="{{ object.get_absolute_url }}">{{ object.slug }}</a></br>
{% endfor %}
高度感谢所有帮助和指导。
答案 0 :(得分:0)
您需要重写queryset
方法,而不是在SubcategoryListView类中定义get_queryset
属性。应该使用子弹按父类别进行过滤。
class SubcategoryListView(ListView):
template_name = 'category/detail.html'
def get_queryset(self):
return Subcategory.objects.filter(category__slug=self.kwargs['slug])