• Django后台项目实战之后台菜品类别信息管理


    后台菜品类别信息管理

    本页面完成项目后台管理的菜品类别信息模块操作

    (1). 菜品类别信息数据表:category

    • 在数据库 osdb 中创建 category 表,若此表已存在请跳过
    1. CREATE TABLE `category` (
    2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜品分类id',
    3. `shop_id` int(11) DEFAULT NULL COMMENT '店铺id',
    4. `name` varchar(50) DEFAULT NULL COMMENT '分类名称',
    5. `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1正常 9删除',
    6. `create_at` datetime DEFAULT NULL COMMENT '添加时间',
    7. `update_at` datetime DEFAULT NULL COMMENT '修改时间',
    8. PRIMARY KEY (`id`)
    9. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    (2). 定义模型Model类

    • 进入myadmin应用目录中编辑:myobject/myadmin/models.py 模型文件
    1. from django.db import models
    2. #菜品分类信息模型
    3. class Category(models.Model):
    4. shop_id = models.IntegerField() #店铺id
    5. name = models.CharField(max_length=50)#分类名称
    6. status = models.IntegerField(default=1) #状态:1正常/9删除
    7. create_at = models.DateTimeField(default=datetime.now) #创建时间
    8. update_at = models.DateTimeField(default=datetime.now) #修改时间
    9. class Meta:
    10. db_table = "category" # 更改表名

    (3). 项目urls路由信息配置

    • 打开根路由文件:myobject/myadmin/urls.py路由文件,编辑路由配置信息
    1. from django.urls import path
    2. ...
    3. from myadmin.views import category
    4. urlpatterns = [
    5. ...
    6. #菜品分类信息管理
    7. path('category/', category.index, name="myadmin_category_index"),
    8. path('category/load/', category.loadCategory, name="myadmin_category_load"),
    9. path('category/add', category.add, name="myadmin_category_add"),
    10. path('category/insert', category.insert, name="myadmin_category_insert"),
    11. path('category/del/', category.delete, name="myadmin_category_del"),
    12. path('category/edit/', category.edit, name="myadmin_category_edit"),
    13. path('category/update/', category.update, name="myadmin_category_update"),
    14. ]

    (4). 编辑视图文件

    • 新建视图文件:myobject/myadmin/views/category.py 视图文件,并进行编辑
    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. from django.http import JsonResponse
    4. from django.core.paginator import Paginator
    5. from datetime import datetime
    6. from myadmin.models import Category,Shop
    7. # 菜品分类信息
    8. def index(request,pIndex=1):
    9. '''浏览信息'''
    10. smod = Category.objects
    11. mywhere=[]
    12. list = smod.filter(status__lt=9)
    13. # 获取、判断并封装关keyword键搜索
    14. kw = request.GET.get("keyword",None)
    15. if kw:
    16. # 查询店铺名称中只要含有关键字就可以
    17. list = list.filter(name__contains=kw)
    18. mywhere.append("keyword="+kw)
    19. # 获取、判断并封装状态status搜索条件
    20. status = request.GET.get('status','')
    21. if status != '':
    22. list = list.filter(status=status)
    23. mywhere.append("status="+status)
    24. #执行分页处理
    25. pIndex = int(pIndex)
    26. page = Paginator(list,10) #以10条每页创建分页对象
    27. maxpages = page.num_pages #最大页数
    28. #判断页数是否越界
    29. if pIndex > maxpages:
    30. pIndex = maxpages
    31. if pIndex < 1:
    32. pIndex = 1
    33. list2 = page.page(pIndex) #当前页数据
    34. plist = page.page_range #页码数列表
    35. #遍历信息,并获取对应的商铺名称,以shopname名封装
    36. for vo in list2:
    37. sob = Shop.objects.get(id=vo.shop_id)
    38. vo.shopname = sob.name
    39. #封装信息加载模板输出
    40. context = {"categorylist":list2,'plist':plist,'pIndex':pIndex,'maxpages':maxpages,'mywhere':mywhere}
    41. return render(request,"myadmin/category/index.html",context)
    42. def loadCategory(request,sid):
    43. clist = Category.objects.filter(status__lt=9,shop_id=sid).values("id","name")
    44. #返回QuerySet对象,使用list强转成对应的菜品分类列表信息
    45. return JsonResponse({'data':list(clist)})
    46. def add(request):
    47. '''加载添加页面'''
    48. slist = Shop.objects.values("id","name")
    49. context={"shoplist":slist}
    50. return render(request,"myadmin/category/add.html",context)
    51. def insert(request):
    52. '''执行添加'''
    53. try:
    54. ob = Category()
    55. ob.shop_id = request.POST['shop_id']
    56. ob.name = request.POST['name']
    57. ob.status = 1
    58. ob.create_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    59. ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    60. ob.save()
    61. context={"info":"添加成功!"}
    62. except Exception as err:
    63. print(err)
    64. context={"info":"添加失败"}
    65. return render(request,"myadmin/info.html",context)
    66. def delete(request,cid):
    67. '''删除信息'''
    68. try:
    69. ob = Category.objects.get(id=cid)
    70. ob.status = 9
    71. ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    72. ob.save()
    73. context={"info":"删除成功!"}
    74. except Exception as err:
    75. print(err)
    76. context={"info":"删除失败"}
    77. return JsonResponse(context)
    78. #return render(request,"myadmin/info.html",context)
    79. def edit(request,cid):
    80. '''加载编辑信息页面'''
    81. try:
    82. ob = Category.objects.get(id=cid)
    83. slist = Shop.objects.values("id","name")
    84. context={"category":ob,"shoplist":slist}
    85. return render(request,"myadmin/category/edit.html",context)
    86. except Exception as err:
    87. context={"info":"没有找到要修改的信息!"}
    88. return render(request,"myadmin/info.html",context)
    89. def update(request,cid):
    90. '''执行编辑信息'''
    91. try:
    92. ob = Category.objects.get(id=cid)
    93. ob.shop_id = request.POST['shop_id']
    94. ob.name = request.POST['name']
    95. #ob.status = request.POST['status']
    96. ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    97. ob.save()
    98. context={"info":"修改成功!"}
    99. except Exception as err:
    100. print(err)
    101. context={"info":"修改失败"}
    102. return render(request,"myadmin/info.html",context)

    (5). 编写模板文件

    • 5.1. 打开父类模板:/templates/myadmin/base.html ,编辑导航栏代码
    1. ...
    2. <li class="treeview">
    3. <a href="category.html"><i class="fa fa-cutlery"></i> <span>菜品管理</span>
    4. <span class="pull-right-container">
    5. <i class="fa fa-angle-left pull-right"></i>
    6. </span>
    7. </a>
    8. <ul class="treeview-menu">
    9. <li><a href="{% url 'myadmin_category_index' 1 %}"> <i class="fa fa-circle-o"></i> 菜品分类</a></li>
    10. <li><a href="{% url 'myadmin_product_index' 1 %}"> <i class="fa fa-circle-o"></i> 菜品信息</a></li>
    11. </ul>
    12. </li>
    13. ...
    • 5.2. 后台商品类别信息浏览页模板:/templates/myadmin/category/index.html

     

    1. {% extends "myadmin/base.html" %}
    2. {% block main_body %}
    3. <!-- Content Header (Page header) -->
    4. <section class="content-header">
    5. <h1>
    6. 菜品类别管理
    7. <small>订餐系统后台管理</small>
    8. </h1>
    9. <ol class="breadcrumb">
    10. <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
    11. <li class="active">菜品分类信息管理</li>
    12. </ol>
    13. </section>
    14. <!-- Main content -->
    15. <section class="content container-fluid">
    16. <div class="row">
    17. <div class="col-xs-12">
    18. <div class="box">
    19. <div class="box-header">
    20. <h3 class="box-title"><i class="fa fa-calendar"></i> 菜品分类信息表</h3>
    21. <div class="box-tools">
    22. <div class="input-group input-group-sm" style="width: 150px;">
    23. <input type="text" name="table_search" class="form-control pull-right" placeholder="Search">
    24. <div class="input-group-btn">
    25. <button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
    26. </div>
    27. </div>
    28. </div>
    29. </div>
    30. <!-- /.box-header -->
    31. <div class="box-body table-responsive no-padding">
    32. <table class="table table-hover">
    33. <tr>
    34. <th>ID</th>
    35. <th>店铺名称</th>
    36. <th>类别名称</th>
    37. <th>当前状态</th>
    38. <th>添加时间</th>
    39. <th>修改时间</th>
    40. <th>操作</th>
    41. </tr>
    42. {% for vo in categorylist %}
    43. <tr>
    44. <td>{{ vo.id }}</td>
    45. <td>{{ vo.shopname }}</td>
    46. <td>{{ vo.name }}</td>
    47. <td>
    48. {% if vo.status == 1 %}
    49. <span style="color:green">正常</span>
    50. {% elif vo.status == 9 %}
    51. <span style="color:red">已删除</span>
    52. {% else %}
    53. <span style="color:red">未知状态</span>
    54. {% endif %}
    55. </td>
    56. <td width="12%">{{ vo.create_at|date:'Y-m-d' }}</td>
    57. <td width="12%">{{ vo.update_at|date:'Y-m-d' }}</td>
    58. <td width="25%">
    59. <a href="{% url 'myadmin_category_edit' vo.id %}" class="btn btn-success btn-xs">
    60. <span class="glyphicon glyphicon-edit" aria-hidden="true"></span> 编辑</a>
    61. <button type="button" onclick="doDelete('{% url 'myadmin_category_del' vo.id %}')" class="btn btn-danger btn-xs">
    62. <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 删除</button>
    63. <a href="#" class="btn btn-warning btn-xs">
    64. <span class="glyphicon glyphicon-search" aria-hidden="true"></span> 查看菜品</a>
    65. </td>
    66. </tr>
    67. {% endfor %}
    68. </table>
    69. </div>
    70. <!-- /.box-body -->
    71. <div class="box-footer clearfix">
    72. <a role="button" href="{% url 'myadmin_category_add' %}" class="btn btn-primary">
    73. <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 添加菜品分类</a>
    74. <ul class="pagination pagination-sm no-margin pull-right">
    75. <li><a href="{% url 'myadmin_category_index' pIndex|add:-1 %}?{{mywhere|join:'&'}}">&laquo;</a></li>
    76. {% for p in plist %}
    77. <li {% if p == pIndex %}class="active"{% endif %}><a href="{% url 'myadmin_category_index' p %}?{{mywhere|join:'&'}}">{{p}}</a></li>
    78. {% endfor %}
    79. <li><a href="{% url 'myadmin_category_index' pIndex|add:1 %}?{{mywhere|join:'&'}}">&raquo;</a></li>
    80. </ul>
    81. </div>
    82. </div>
    83. <!-- /.box -->
    84. </div>
    85. </div>
    86. </section>
    87. <!-- /.content -->
    88. {% endblock %}
    • 5.3. 后台商品类别信息添加表单页模板:/templates/myadmin/category/add.html

     

    1. {% extends "myadmin/base.html" %}
    2. {% block main_body %}
    3. <!-- Content Header (Page header) -->
    4. <section class="content-header">
    5. <h1>
    6. 菜品分类管理
    7. <small>订餐系统后台管理</small>
    8. </h1>
    9. <ol class="breadcrumb">
    10. <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
    11. <li class="active">菜品分类信息管理</li>
    12. </ol>
    13. </section>
    14. <!-- Main content -->
    15. <section class="content container-fluid">
    16. <div class="row">
    17. <div class="col-xs-12">
    18. <div class="box">
    19. <div class="box-header">
    20. <h2 class="box-title"><span class="glyphicon glyphicon-calendar" aria-hidden="true">添加菜品分类信息</h2>
    21. </div>
    22. <!-- /.box-header -->
    23. <!-- form start -->
    24. <form class="form-horizontal" action="{% url 'myadmin_category_insert' %}" method="post">
    25. {% csrf_token %}
    26. <div class="box-body">
    27. <div class="form-group">
    28. <label for="inputEmail3" class="col-sm-2 control-label">店铺名称:</label>
    29. <div class="col-sm-4">
    30. <select name="shop_id" class="form-control select2" style="width: 100%;">
    31. {% for svo in shoplist %}
    32. <option value="{{ svo.id }}">{{ svo.name }}</option>
    33. {% endfor %}
    34. </select>
    35. </div>
    36. </div>
    37. <div class="form-group">
    38. <label for="inputEmail3" class="col-sm-2 control-label">类别名称:</label>
    39. <div class="col-sm-4">
    40. <input type="text" name="name" class="form-control" id="inputText2" placeholder="类别名称" />
    41. </div>
    42. </div>
    43. </div>
    44. <!-- /.box-body -->
    45. <div class="box-footer">
    46. <div class="col-sm-offset-2 col-sm-10">
    47. <button type="submit" class="btn btn-primary">提交</button> &nbsp;
    48. <button type="reset" class="btn btn-default">重置</button>
    49. <div class="col-sm-offset-2 col-sm-10">
    50. </div>
    51. <!-- /.box-footer -->
    52. </form>
    53. </div>
    54. <!-- /.box -->
    55. </div>
    56. </div>
    57. </section>
    58. <!-- /.content -->
    59. {% endblock %}
    • 5.4. 后台商品信息编辑模板:/templates/myadmin/category/edit.html

     

    1. {% extends "myadmin/base.html" %}
    2. {% block main_body %}
    3. <!-- Content Header (Page header) -->
    4. <section class="content-header">
    5. <h1>
    6. 菜品分类管理
    7. <small>订餐系统后台管理</small>
    8. </h1>
    9. <ol class="breadcrumb">
    10. <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
    11. <li class="active">菜品分类信息管理</li>
    12. </ol>
    13. </section>
    14. <!-- Main content -->
    15. <section class="content container-fluid">
    16. <div class="row">
    17. <div class="col-xs-12">
    18. <div class="box">
    19. <div class="box-header">
    20. <h2 class="box-title"><span class="glyphicon glyphicon-calendar" aria-hidden="true">编辑菜品分类信息</h2>
    21. </div>
    22. <!-- /.box-header -->
    23. <!-- form start -->
    24. <form class="form-horizontal" action="{% url 'myadmin_category_update' category.id %}" method="post">
    25. {% csrf_token %}
    26. <div class="box-body">
    27. <div class="form-group">
    28. <label for="inputEmail3" class="col-sm-2 control-label">店铺名称:</label>
    29. <div class="col-sm-4">
    30. <select name="shop_id" class="form-control select2" style="width: 100%;">
    31. {% for svo in shoplist %}
    32. <option value="{{ svo.id }}" {% if category.shop_id == svo.id %}selected{% endif %} >{{ svo.name }}</option>
    33. {% endfor %}
    34. </select>
    35. </div>
    36. </div>
    37. <div class="form-group">
    38. <label for="inputEmail3" class="col-sm-2 control-label">类别名称:</label>
    39. <div class="col-sm-4">
    40. <input type="text" name="name" value="{{ category.name }}" class="form-control" id="inputText2" placeholder="类别名称" />
    41. </div>
    42. </div>
    43. </div>
    44. <!-- /.box-body -->
    45. <div class="box-footer">
    46. <div class="col-sm-offset-2 col-sm-10">
    47. <button type="submit" class="btn btn-primary">保存</button> &nbsp;
    48. <button type="reset" class="btn btn-default">重置</button>
    49. <div class="col-sm-offset-2 col-sm-10">
    50. </div>
    51. <!-- /.box-footer -->
    52. </form>
    53. </div>
    54. <!-- /.box -->
    55. </div>
    56. </div>
    57. </section>
    58. <!-- /.content -->
    59. {% endblock %}

    6 运行测试

    1. [root@localhost myobject]# pwd
    2. /python/myobject
    3. [root@localhost myobject]# ls
    4. manage.py myadmin myobject myweb static templates
    5. [root@localhost myobject]# python3 manage.py runserver
    6. Performing system checks...
    7. System check identified no issues (0 silenced).
    8. April 07, 2020 - 16:29:36
    9. Django version 1.11, using settings 'myobject.settings'
    10. Starting development server at http://127.0.0.1:8000/
    11. Quit the server with CONTROL-C.
    12. ^C[root@localhost myobject]#
  • 相关阅读:
    超详细的hadoop完全分布式安装及xsync等各个脚本
    前端 基础知识
    【4】字符设备的read/write
    Linux修改认证加密方式为sha512
    SpringBoot启动源码-初了解
    聊聊设计模式——命令模式
    Vue3 computed根据返回的字段显示颜色
    MPJ: MyBatis-Plus-Join连表查询
    BL808:【M1s DOCK开发板】与LVGL 使用体验
    初识javaweb2 tomcat
  • 原文地址:https://blog.csdn.net/xyh2004/article/details/139288736