详情介绍
model.py中创建模型类 class BaseTime(models.Model): """ 基类 """ first_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) last_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) boole = models.BooleanField(verbose_name='是否显示', default=True, blank=True) class Meta: abstract = True class Category(BaseTime): """ 商品类别 """ objects = None name = models.CharField(max_length=18, verbose_name='类别名称') parent = models.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父类别') class Meta: # db_table = 'water_goods_category' verbose_name = '商品类别test' verbose_name_plural = verbose_name def __str__(self): return self.name class ChannelGroup(BaseTime): """商品频道组""" objects = None name = models.CharField(max_length=20, verbose_name='频道组名') class Meta: # db_table = 'water_channel_group' verbose_name = '商品频道组' verbose_name_plural = verbose_name def __str__(self): return self.name class Channel(BaseTime): """商品频道""" objects = None group = models.ForeignKey(ChannelGroup, on_delete=models.CASCADE, verbose_name='频道组名') # 级联删除:models.CASCADE category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='顶级商品类别') url = models.CharField(max_length=100, verbose_name='频道页面链接', help_text='例如:http://www.baidu.com/') sequence = models.IntegerField(verbose_name='组内顺序') class Meta: # db_table = 'water_goods_channel' verbose_name = '商品频道' verbose_name_plural = verbose_name def __str__(self): return self.category.name
<div class="h-nav clearfix"> <div class="w1200 container"> <div class="side-nav"> <span class="meau_but">项目分类</span> <div class="nav_1"> <ul class="nav_1_ul"> {% for group in categories %} <li> {% for channel in group.channels %} <div class="tanchu"> <i class="icon icon-food"></i> <span><a href="{{ channel.url }}" target="_blank">{{ channel.name }}</a></span> <em class="icon-arrow"></em> </div> {% endfor %} <div class="menu-box"> <div class="menu-nav"> {% for cat2 in group.sub_cats %} <dl class="menu-list"> <dt><a href="/goods?st={{ cat2.name }}">{{ cat2.name }}</a></dt> <dd> {% for cat3 in cat2.sub_cats %} <a href="/goods/{{ cat3.id }}" target="_blank">{{ cat3.name }}</a> {% endfor %} </dd> </dl> {% endfor %} </div> </div> </li> {% endfor %} </ul> </div> </div>
# 封装方法 获得所有商品方法菜单导航分类 def get_categories(): # 查看并展示商品的分类 categories = {} # 查询一级类别 d = Channel.objects.order_by('group_id') for channel in d: group_id = channel.group_id if group_id not in categories: # category最顶级商品类别,如果当前频道不在顶级商品类别中 categories[group_id] = {'channels': [], "sub_cats": []} # print(channel.url, channel.category) cat1 = channel.category # cat1是对象,category是外键字段 categories[group_id]['channels'].append({ # channel本身包含字典数据 "id": cat1.id, "name": cat1.name, # category外键关联的name字段 "url": channel.url }) # 查询二级和三级类别信息 for cat2 in Category.objects.filter(parent__id=cat1.id).all(): # 通过频道对应的一级类别来查询 cat2.sub_cats = [] # 创建是为了方便cat3进行添加数据 categories[group_id]['sub_cats'].append({ "id": cat2.id, "name": cat2.name, # cat2对象本身模型GoodsCategory的name字段 "sub_cats": cat2.sub_cats }) # 查询三级类别信息 for cat3 in Category.objects.filter(parent__id=cat2.id).all(): # 通过二级类别来查询三级 cat2.sub_cats.append({ # 方便cat3进行添加数据到cat2的list中 "id": cat3.id, "name": cat3.name, }) return categories