Django 实现首页三级菜单显示
电商网站首页商品信息显示
视图函数向页面传参数的方式:
-
构造待传入前端页面的变量
view_param
-
将
view_param
封装成如下形式:context = { 'var_key':view_param }
-
以如下形式返回:
return render(request, 'object.html', context)
-
前端页面以如下形式接收:
{{ var_key }}
最终要实现的效果如图:
前端页面代码:
首页
模型类代码:
from django.db import models
from indexpage.utils.models import BaseModel
class GoodsCategory(BaseModel):
"""商品类别"""
name = models.CharField(max_length=10, verbose_name='名称')
parent = models.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE,
verbose_name='父类别')
class Meta:
db_table = 'tb_goods_category'
verbose_name = '商品类别'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class GoodsChannelGroup(BaseModel):
"""商品频道组"""
name = models.CharField(max_length=20, verbose_name='频道组名')
class Meta:
db_table = 'tb_channel_group'
verbose_name = '商品频道组'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class GoodsChannel(BaseModel):
"""商品频道"""
group = models.ForeignKey(GoodsChannelGroup, verbose_name='频道组名')
# 级联删除:models.CASCADE
category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='顶级商品类别')
url = models.CharField(max_length=50, verbose_name='频道页面链接')
sequence = models.IntegerField(verbose_name='组内顺序')
class Meta:
db_table = 'tb_goods_channel'
verbose_name = '商品频道'
verbose_name_plural = verbose_name
def __str__(self):
return self.category.name
视图函数代码:
from django.shortcuts import render
from django.views import View
from indexpage.utils.meiduo_category import get_categories
class ListView(View):
def get(self, request):
# 1.查询所有频道并排序
categories = get_categories()
context = {
'categories':categories,
}
return render(request, 'index.html', context)
get_categories()工具代码:
from goods.models import GoodsChannel
def get_categories():
# 1.1查询所有频道并排序
channels = GoodsChannel.objects.order_by('group_id', 'sequence')
print('channels:', channels)
# 1.2遍历,转换频道结构
catetories = {}
for channel in channels:
# categories[1]={手机}
# categories[1]={相机}
# 1.3判断此频道是否已经存在,如果不存在则新建字典
if channel.group_id not in catetories:
catetories[channel.group_id] = {
'channels': [], # 一级分类列表
'sub_cats': [] # 二级分类列表
}
# 1.4获取当前频道
channel_dict = catetories[channel.group_id]
# 1.5向一级分类中添加数据
channel_dict['channels'].append({
'name': channel.category.name,
'url': channel.url
})
'''
categories={
1:{
'channels':[{手机},{相机},{数码}],
'sub_cats':[]
},
2:{
'channels':[{电脑},{办公}],
'sub_cats':[]
},
3:{
'channels':[],
'sub_cats':[]
}
}
'''
# 1.6向二级分类中添加数据
for cat2 in channel.category.subs.all():
channel_dict['sub_cats'].append({
'name': cat2.name,
# 1.7添加三级分类
'sub_cats': cat2.subs.all()
})
return catetories
源码