目录

生鲜超市(一)    生鲜超市(二)    生鲜超市(三)

生鲜超市(四)    生鲜超市(五)    生鲜超市(六)

生鲜超市(七)    生鲜超市(八)    生鲜超市(九)

生鲜超市(十)    生鲜超市(十一)    生鲜超市(十二)    生鲜超市(十三)

代码下载

github

教程

学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市

四、xadmin后台管理

4.1.xadmin添加富文本插件

(1)xadmin/plugins文件夹下新建文件ueditor.py

代码如下:

  1. # xadmin/plugins/ueditor.py
  2.  
  3. import xadmin
  4. from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
  5. from DjangoUeditor.models import UEditorField
  6. from DjangoUeditor.widgets import UEditorWidget
  7. from django.conf import settings
  8.  
  9. class XadminUEditorWidget(UEditorWidget):
  10. def __init__(self, **kwargs):
  11. self.ueditor_options = kwargs
  12. self.Media.js = None
  13. super(XadminUEditorWidget,self).__init__(kwargs)
  14.  
  15. class UeditorPlugin(BaseAdminPlugin):
  16.  
  17. def get_field_style(self, attrs, db_field, style, **kwargs):
  18. if style == 'ueditor':
  19. if isinstance(db_field, UEditorField):
  20. widget = db_field.formfield().widget
  21. param = {}
  22. param.update(widget.ueditor_settings)
  23. param.update(widget.attrs)
  24. return {'widget':XadminUEditorWidget(**param)}
  25. return attrs
  26.  
  27. def block_extrahead(self, context, nodes):
  28. js = '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.config.js")
  29. js += '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.all.min.js")
  30. nodes.append(js)
  31.  
  32. xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
  33. xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)

(2)把插件添加到__init__.py里面

  1. # xadmin/plugins/__init__.py
  2.  
  3. PLUGINS = (
  4. 'ueditor',
  5. )

4.2.url配置

配置xadmin和ueditor的路由

  1. # MxShop/urls.py
  2.  
  3. import xadmin
  4.  
  5. from django.urls import path,include
  6.  
  7. urlpatterns = [
  8. path('xadmin/', xadmin.site.urls),
  9. path('ueditor/', include('DjangoUeditor.urls')),
  10. ]

4.3.注册app到xadmin后台

四个app下面都新建文件adminx.py,然后分别注册到后台

(1)users/adminx.py

  1. # users/adminx.py
  2. __author__ = 'derek'
  3.  
  4. import xadmin
  5. from xadmin import views
  6. from .models import VerifyCode
  7.  
  8. class BaseSetting(object):
  9. #添加主题功能
  10. enable_themes = True
  11. use_bootswatch = True
  12.  
  13. class GlobalSettings(object):
  14. #全局配置,后台管理标题和页脚
  15. site_title = "仙剑奇侠传"
  16. site_footer = "http://www.cnblogs.com/derek1184405959/"
  17. #菜单收缩
  18. menu_style = "accordion"
  19.  
  20. class VerifyCodeAdmin(object):
  21. list_display = ['code', 'mobile', "add_time"]
  22.  
  23. xadmin.site.register(VerifyCode, VerifyCodeAdmin)
  24. xadmin.site.register(views.BaseAdminView, BaseSetting)
  25. xadmin.site.register(views.CommAdminView, GlobalSettings)

修改app名字为中文

  1. # users/apps.py
  2.  
  3. from django.apps import AppConfig
  4.  
  5. class UsersConfig(AppConfig):
  6. name = 'users'
  7. #app名字后台显示中文
  8. verbose_name = "用户管理"

还需要__init__.py中修改默认配置才生效

  1. # users/__init__.py
  2.  
  3. default_app_config = 'users.apps.UsersConfig'

其它三个app一样的操作

(2)goods/adminx.py

  1. # goods/adminx.py
  2.  
  3. import xadmin
  4. from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner, HotSearchWords
  5. from .models import IndexAd
  6.  
  7. class GoodsAdmin(object):
  8. #显示的列
  9. list_display = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
  10. "shop_price", "goods_brief", "goods_desc", "is_new", "is_hot", "add_time"]
  11. #可以搜索的字段
  12. search_fields = ['name', ]
  13. #列表页可以直接编辑的
  14. list_editable = ["is_hot", ]
  15. #过滤器
  16. list_filter = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
  17. "shop_price", "is_new", "is_hot", "add_time", "category__name"]
  18. #富文本编辑器
  19. style_fields = {"goods_desc": "ueditor"}
  20.  
  21. #在添加商品的时候可以添加商品图片
  22. class GoodsImagesInline(object):
  23. model = GoodsImage
  24. exclude = ["add_time"]
  25. extra = 1
  26. style = 'tab'
  27.  
  28. inlines = [GoodsImagesInline]
  29.  
  30. class GoodsCategoryAdmin(object):
  31. list_display = ["name", "category_type", "parent_category", "add_time"]
  32. list_filter = ["category_type", "parent_category", "name"]
  33. search_fields = ['name', ]
  34.  
  35. class GoodsBrandAdmin(object):
  36. list_display = ["category", "image", "name", "desc"]
  37.  
  38. def get_context(self):
  39. context = super(GoodsBrandAdmin, self).get_context()
  40. if 'form' in context:
  41. context['form'].fields['category'].queryset = GoodsCategory.objects.filter(category_type=1)
  42. return context
  43.  
  44. class BannerGoodsAdmin(object):
  45. list_display = ["goods", "image", "index"]
  46.  
  47. class HotSearchAdmin(object):
  48. list_display = ["keywords", "index", "add_time"]
  49.  
  50. class IndexAdAdmin(object):
  51. list_display = ["category", "goods"]
  52.  
  53. xadmin.site.register(Goods, GoodsAdmin)
  54. xadmin.site.register(GoodsCategory, GoodsCategoryAdmin)
  55. xadmin.site.register(Banner, BannerGoodsAdmin)
  56. xadmin.site.register(GoodsCategoryBrand, GoodsBrandAdmin)
  57.  
  58. xadmin.site.register(HotSearchWords, HotSearchAdmin)
  59. xadmin.site.register(IndexAd, IndexAdAdmin)
  1. # goods/apps.py
  2.  
  3. from django.apps import AppConfig
  4.  
  5. class GoodsConfig(AppConfig):
  6. name = 'goods'
  7. verbose_name = '商品管理'
  1. # good/__init__.py
  2.  
  3. default_app_config = 'goods.apps.GoodsConfig'

(3)trade/adminx.py

  1. # trade/adminx.py
  2. __author__ = 'derek'
  3.  
  4. import xadmin
  5. from .models import ShoppingCart, OrderInfo, OrderGoods
  6.  
  7. class ShoppingCartAdmin(object):
  8. list_display = ["user", "goods", "nums", ]
  9.  
  10. class OrderInfoAdmin(object):
  11. list_display = ["user", "order_sn", "trade_no", "pay_status", "post_script", "order_mount",
  12. "order_mount", "pay_time", "add_time"]
  13.  
  14. class OrderGoodsInline(object):
  15. model = OrderGoods
  16. exclude = ['add_time', ]
  17. extra = 1
  18. style = 'tab'
  19.  
  20. inlines = [OrderGoodsInline, ]
  21.  
  22. xadmin.site.register(ShoppingCart, ShoppingCartAdmin)
  23. xadmin.site.register(OrderInfo, OrderInfoAdmin)
  1. # trade/apps.py
  2.  
  3. from django.apps import AppConfig
  4.  
  5. class TradeConfig(AppConfig):
  6. name = 'trade'
  7. verbose_name = '交易管理'
  1. # trade/__init__.py
  2.  
  3. default_app_config = 'trade.apps.TradeConfig'

(4)user_operation/adminx.py

  1. # user_operation/adminx.py
  2. __author__ = 'derek'
  3.  
  4. import xadmin
  5. from .models import UserFav, UserLeavingMessage, UserAddress
  6.  
  7. class UserFavAdmin(object):
  8. list_display = ['user', 'goods', "add_time"]
  9.  
  10. class UserLeavingMessageAdmin(object):
  11. list_display = ['user', 'message_type', "message", "add_time"]
  12.  
  13. class UserAddressAdmin(object):
  14. list_display = ["signer_name", "signer_mobile", "district", "address"]
  15.  
  16. xadmin.site.register(UserFav, UserFavAdmin)
  17. xadmin.site.register(UserAddress, UserAddressAdmin)
  18. xadmin.site.register(UserLeavingMessage, UserLeavingMessageAdmin)
  1. # user_operation/apps.py
  2.  
  3. from django.apps import AppConfig
  4.  
  5. class UserOperationConfig(AppConfig):
  6. name = 'user_operation'
  7. verbose_name = '操作管理'
  1. # user_operation/__init__.py
  2.  
  3. default_app_config = 'user_operation.apps.UserOperationConfig'

(5)生成数据库表

  1. python manage.py makemigrations
  2.  
  3. python manage.py migrate

4.4.导入商品类别数据

由于分类和商品很多,就写个脚本导入数据

单独使用django的model,批量导入数据

  • db_tools下新建文件夹data,然后把前端的json文件(category_data和product_data)拷贝到里面
  • 把brands和goods图片拷贝到media目录下

db_tools下新建文件 import_category_data.py

代码如下:

  1. # db_tools/data/import_category_data.py
  2.  
  3. #独立使用django的model
  4. import sys
  5. import os
  6.  
  7. #获取当前文件的路径(运行脚本)
  8. pwd = os.path.dirname(os.path.realpath(__file__))
  9. #获取项目的跟目录
  10. sys.path.append(pwd+"../")
  11. #要想单独使用django的model,必须指定一个环境变量,会去settings配置找
  12. #参照manage.py里面就知道为什么这样设置了
  13. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")
  14.  
  15. import django
  16. django.setup()
  17.  
  18. from goods.models import GoodsCategory
  19.  
  20. from db_tools.data.category_data import row_data
  21.  
  22. #一级类
  23. for lev1_cat in row_data:
  24. lev1_intance = GoodsCategory()
  25. lev1_intance.code = lev1_cat["code"]
  26. lev1_intance.name = lev1_cat["name"]
  27. lev1_intance.category_type = 1
  28. #保存到数据库
  29. lev1_intance.save()
  30. #二级类
  31. for lev2_cat in lev1_cat["sub_categorys"]:
  32. lev2_intance = GoodsCategory()
  33. lev2_intance.code = lev2_cat["code"]
  34. lev2_intance.name = lev2_cat["name"]
  35. lev2_intance.category_type = 2
  36. lev2_intance.parent_category = lev1_intance
  37. lev2_intance.save()
  38. #三级类
  39. for lev3_cat in lev2_cat["sub_categorys"]:
  40. lev3_intance = GoodsCategory()
  41. lev3_intance.code = lev3_cat["code"]
  42. lev3_intance.name = lev3_cat["name"]
  43. lev3_intance.category_type = 3
  44. lev3_intance.parent_category = lev2_intance
  45. lev3_intance.save()

然后运行脚本 import_category_data.py  数据就可以保存到数据库了

4.5.导入商品

在data目录下新建import_goods_data.py

  1. import sys
  2. import os
  3.  
  4. pwd = os.path.dirname(os.path.realpath(__file__))
  5. sys.path.append(pwd+"../")
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")
  7.  
  8. import django
  9. django.setup()
  10.  
  11. from goods.models import Goods, GoodsCategory, GoodsImage
  12.  
  13. from db_tools.data.product_data import row_data
  14.  
  15. for goods_detail in row_data:
  16. goods = Goods()
  17. goods.name = goods_detail["name"]
  18. #前端中是“¥232”,数据库中是float类型,所以要替换掉
  19. goods.market_price = float(int(goods_detail["market_price"].replace("¥", "").replace("元", "")))
  20. goods.shop_price = float(int(goods_detail["sale_price"].replace("¥", "").replace("元", "")))
  21. goods.goods_brief = goods_detail["desc"] if goods_detail["desc"] is not None else ""
  22. goods.goods_desc = goods_detail["goods_desc"] if goods_detail["goods_desc"] is not None else ""
  23. # 取第一张作为封面图
  24. goods.goods_front_image = goods_detail["images"][0] if goods_detail["images"] else ""
  25. #取最后一个
  26. category_name = goods_detail["categorys"][-1]
  27. # 取出当前子类对应的GoodsCategory对象,filter没有匹配的会返回空数组,不会抛异常。
  28. category = GoodsCategory.objects.filter(name=category_name)
  29. if category:
  30. goods.category = category[0]
  31. goods.save()
  32.  
  33. for goods_image in goods_detail["images"]:
  34. goods_image_instance = GoodsImage()
  35. goods_image_instance.image = goods_image
  36. goods_image_instance.goods = goods
  37. goods_image_instance.save()

然后运行,把商品生产到数据库中

配置media路径

settings中

  1. # 设置上传文件的路径
  2. MEDIA_URL="/media/"
  3. MEDIA_ROOT=os.path.join(BASE_DIR,"media")

urls.py

  1. # MxShop/urls.py
  2. __author__ = 'derek'
  3.  
  4. from django.urls import path,include
  5. import xadmin
  6. from django.views.static import serve
  7. from MxShop.settings import MEDIA_ROOT
  8.  
  9. urlpatterns = [
  10. path('xadmin/', xadmin.site.urls),
  11. path('ueditor/',include('DjangoUeditor.urls' )),
  12. #文件
  13. path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
  14. ]

目录结构

上一篇:Django REST framework+Vue 打造生鲜超市(二)

Django REST framework+Vue 打造生鲜超市(三)的更多相关文章

  1. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  2. Django REST framework+Vue 打造生鲜超市(五)

    六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...

  3. Django REST framework+Vue 打造生鲜超市(十二)

    十三.首页.商品数量.缓存和限速功能开发  13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地 (1)goods/serializer class B ...

  4. Django REST framework+Vue 打造生鲜超市(二)

    三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip in ...

  5. Django REST framework+Vue 打造生鲜超市(一)

    一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...

  6. Django REST framework+Vue 打造生鲜超市(六)

    七.用户登录与手机注册 7.1.drf的token (1)INSTALL_APP中添加 INSTALLED_APPS = ( ... 'rest_framework.authtoken' ) toke ...

  7. Django REST framework+Vue 打造生鲜超市(十)

    十一.pycharm远程代码调试 第三方登录和支付,都需要有服务器才行(回调url),我们可以用pycharm去远程调试服务器代码 服务器环境搭建 以全新阿里云centos7系统为例: 11.1.阿里 ...

  8. Django REST framework+Vue 打造生鲜超市(十一)

    十二.支付宝沙箱环境配置 12.1.创建应用 进入蚂蚁金服开放平台(https://open.alipay.com/platform/home.htm),登录后进入管理中心-->>应用列表 ...

  9. Django REST framework+Vue 打造生鲜超市(十三)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

随机推荐

  1. 数组Array、数组API

    1.数组:批量管理多个数据的存储空间. 数组的作用:现实中,批量管理多个数据都是集中分组存放,良好的数据结构,可极大提高程序的执行效率! 优点:方便查找 2.创建数组:(4种方式) (1)var 变量 ...

  2. 如何为Web应用选择托管主机

    PHP应用开发好了?恭喜你!不过,现在还没什么用,因为用户无法使用.你要把应用存储到服务器中,让预期受众能访问.一般来说,存储PHP应用有四种方式:共享服务器.虚拟私有服务器.专用服务器和平台即服务. ...

  3. C# Redis实战(三)

    三.程序配置 在C# Redis实战(二)中我们安装好了Redis的系统服务,此时Redis服务已经运行. 现在我们需要让我们的程序能正确读取到Redis服务地址等一系列的配置信息,首先,需要在Web ...

  4. 大数据(2):基于sogou.500w.utf8数据hive的实践

    一.环境的搭建 1.安装配置mysql rpm –ivh MySQL-server-5.6.14.rpm rpm –ivh MySQL-client-5.6.14.rpm 启动mysql 创建hive ...

  5. phpstorm激活码生成器地址

    http://idea.qinxi1992.cn/ 写在windows/system32/drivers/etc/hosts里 0.0.0.0 account.jetbrains.com 激活码位置: ...

  6. UWP:可滚动的PivotHeader

    UWP开发里,Pivot真是个令人又爱又恨的控件.为了实现某些可滚动Header的效果,有些大佬甚至去掉了原本的Header,使用一个ListView或者ListBox自己画Header,不过这样会让 ...

  7. Mybatis转义字符

    Mybatis的sql语句中需要用到'>'或者'<'时,不能直接使用. < < 小于号 > > 大于号 & & 和 &apos; ' 单引号 ...

  8. 大数据 --> CAP原理和最终一致性

    CAP原理和最终一致性 CAP原理和最终一致性(Eventually Consistency)

  9. 网络通信 --> select()用法

    select()用法 头文件 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> 定义 ...

  10. 基于hi-nginx的web开发(python篇)——表单处理和文件上传

    hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...