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

源码