首页 > 编程视界 > Django

Django三级分类菜单导航模型

2022-08-09

本文网址:http://www.db800.cn/Django/4.html

所属分类:Django

简介描述: model.py中创建模型类model.py中创建模型类class BaseTime(models.Model): """ 基类 """ first_time = models.DateTimeField(verbose_name='创建时间&#39

SEO标签: 暂无标签

购买此书

详情介绍

model.py中创建模型类
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
FXu读报网(DB800.cn)——分享我想分享的一切
FXu读报网(DB800.cn)——分享我想分享的一切
模板中间中调用
<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>
FXu读报网(DB800.cn)——分享我想分享的一切
FXu读报网(DB800.cn)——分享我想分享的一切
View.py视图函数查询

 FXu读报网(DB800.cn)——分享我想分享的一切

# 封装方法  获得所有商品方法菜单导航分类
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