代码下载

github

教程

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

四、xadmin后台管理

4.1.xadmin添加富文本插件

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

代码如下:

# xadmin/plugins/ueditor.pyimport xadmin
from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
from DjangoUeditor.models import UEditorField
from DjangoUeditor.widgets import UEditorWidget
from django.conf import settingsclass XadminUEditorWidget(UEditorWidget):def __init__(self, **kwargs):self.ueditor_options = kwargsself.Media.js = Nonesuper(XadminUEditorWidget,self).__init__(kwargs)class UeditorPlugin(BaseAdminPlugin):def get_field_style(self, attrs, db_field, style, **kwargs):if style == 'ueditor':if isinstance(db_field, UEditorField):widget = db_field.formfield().widgetparam = {}param.update(widget.ueditor_settings)param.update(widget.attrs)return {'widget':XadminUEditorWidget(**param)}return attrsdef block_extrahead(self, context, nodes):js  = '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.config.js")js += '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.all.min.js")nodes.append(js)xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)

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

# xadmin/plugins/__init__.pyPLUGINS = ('ueditor',
)

4.2.url配置

配置xadmin和ueditor的路由

# MxShop/urls.pyimport xadminfrom django.urls import path,includeurlpatterns = [path('xadmin/', xadmin.site.urls),path('ueditor/', include('DjangoUeditor.urls')),
]

4.3.注册app到xadmin后台

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

(1)users/adminx.py

# users/adminx.py
__author__ = 'derek'import xadmin
from xadmin import views
from .models import VerifyCodeclass BaseSetting(object):#添加主题功能enable_themes = Trueuse_bootswatch = Trueclass GlobalSettings(object):#全局配置,后台管理标题和页脚site_title = "仙剑奇侠传"site_footer = "http://www.cnblogs.com/derek1184405959/"#菜单收缩menu_style = "accordion"class VerifyCodeAdmin(object):list_display = ['code', 'mobile', "add_time"]xadmin.site.register(VerifyCode, VerifyCodeAdmin)
xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GlobalSettings)

修改app名字为中文

# users/apps.pyfrom django.apps import AppConfigclass UsersConfig(AppConfig):name = 'users'#app名字后台显示中文verbose_name = "用户管理"

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

# users/__init__.pydefault_app_config = 'users.apps.UsersConfig'

其它三个app一样的操作

(2)goods/adminx.py

# goods/adminx.pyimport xadmin
from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner, HotSearchWords
from .models import IndexAdclass GoodsAdmin(object):#显示的列list_display = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price","shop_price", "goods_brief", "goods_desc", "is_new", "is_hot", "add_time"]#可以搜索的字段search_fields = ['name', ]#列表页可以直接编辑的list_editable = ["is_hot", ]#过滤器list_filter = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price","shop_price", "is_new", "is_hot", "add_time", "category__name"]#富文本编辑器style_fields = {"goods_desc": "ueditor"}#在添加商品的时候可以添加商品图片class GoodsImagesInline(object):model = GoodsImageexclude = ["add_time"]extra = 1style = 'tab'inlines = [GoodsImagesInline]class GoodsCategoryAdmin(object):list_display = ["name", "category_type", "parent_category", "add_time"]list_filter = ["category_type", "parent_category", "name"]search_fields = ['name', ]class GoodsBrandAdmin(object):list_display = ["category", "image", "name", "desc"]def get_context(self):context = super(GoodsBrandAdmin, self).get_context()if 'form' in context:context['form'].fields['category'].queryset = GoodsCategory.objects.filter(category_type=1)return contextclass BannerGoodsAdmin(object):list_display = ["goods", "image", "index"]class HotSearchAdmin(object):list_display = ["keywords", "index", "add_time"]class IndexAdAdmin(object):list_display = ["category", "goods"]xadmin.site.register(Goods, GoodsAdmin)
xadmin.site.register(GoodsCategory, GoodsCategoryAdmin)
xadmin.site.register(Banner, BannerGoodsAdmin)
xadmin.site.register(GoodsCategoryBrand, GoodsBrandAdmin)xadmin.site.register(HotSearchWords, HotSearchAdmin)
xadmin.site.register(IndexAd, IndexAdAdmin)

# goods/apps.pyfrom django.apps import AppConfigclass GoodsConfig(AppConfig):name = 'goods'verbose_name = '商品管理'

# good/__init__.pydefault_app_config = 'goods.apps.GoodsConfig'

(3)trade/adminx.py

# trade/adminx.py
__author__ = 'derek'import xadmin
from .models import ShoppingCart, OrderInfo, OrderGoodsclass ShoppingCartAdmin(object):list_display = ["user", "goods", "nums", ]class OrderInfoAdmin(object):list_display = ["user", "order_sn",  "trade_no", "pay_status", "post_script", "order_mount","order_mount", "pay_time", "add_time"]class OrderGoodsInline(object):model = OrderGoodsexclude = ['add_time', ]extra = 1style = 'tab'inlines = [OrderGoodsInline, ]xadmin.site.register(ShoppingCart, ShoppingCartAdmin)
xadmin.site.register(OrderInfo, OrderInfoAdmin)

# trade/apps.pyfrom django.apps import AppConfigclass TradeConfig(AppConfig):name = 'trade'verbose_name = '交易管理'

# trade/__init__.pydefault_app_config = 'trade.apps.TradeConfig'

(4)user_operation/adminx.py

# user_operation/adminx.py
__author__ = 'derek'import xadmin
from .models import UserFav, UserLeavingMessage, UserAddressclass UserFavAdmin(object):list_display = ['user', 'goods', "add_time"]class UserLeavingMessageAdmin(object):list_display = ['user', 'message_type', "message", "add_time"]class UserAddressAdmin(object):list_display = ["signer_name", "signer_mobile", "district", "address"]xadmin.site.register(UserFav, UserFavAdmin)
xadmin.site.register(UserAddress, UserAddressAdmin)
xadmin.site.register(UserLeavingMessage, UserLeavingMessageAdmin)

# user_operation/apps.pyfrom django.apps import AppConfigclass UserOperationConfig(AppConfig):name = 'user_operation'verbose_name = '操作管理'

# user_operation/__init__.pydefault_app_config = 'user_operation.apps.UserOperationConfig'

(5)生成数据库表

python manage.py makemigrationspython manage.py migrate

4.4.导入商品类别数据

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

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

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

db_tools下新建文件 import_category_data.py

代码如下:

# db_tools/data/import_category_data.py#独立使用django的model
import sys
import os#获取当前文件的路径(运行脚本)
pwd = os.path.dirname(os.path.realpath(__file__))
#获取项目的跟目录
sys.path.append(pwd+"../")
#要想单独使用django的model,必须指定一个环境变量,会去settings配置找
#参照manage.py里面就知道为什么这样设置了
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")import django
django.setup()from goods.models import GoodsCategoryfrom db_tools.data.category_data import row_data#一级类
for lev1_cat in row_data:lev1_intance = GoodsCategory()lev1_intance.code = lev1_cat["code"]lev1_intance.name = lev1_cat["name"]lev1_intance.category_type = 1#保存到数据库lev1_intance.save()
#二级类for lev2_cat in lev1_cat["sub_categorys"]:lev2_intance = GoodsCategory()lev2_intance.code = lev2_cat["code"]lev2_intance.name = lev2_cat["name"]lev2_intance.category_type = 2lev2_intance.parent_category = lev1_intancelev2_intance.save()
#三级类for lev3_cat in lev2_cat["sub_categorys"]:lev3_intance = GoodsCategory()lev3_intance.code = lev3_cat["code"]lev3_intance.name = lev3_cat["name"]lev3_intance.category_type = 3lev3_intance.parent_category = lev2_intancelev3_intance.save()

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

4.5.导入商品

在data目录下新建import_goods_data.py

import sys
import ospwd = os.path.dirname(os.path.realpath(__file__))
sys.path.append(pwd+"../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")import django
django.setup()from goods.models import Goods, GoodsCategory, GoodsImagefrom db_tools.data.product_data import row_datafor goods_detail in row_data:goods = Goods()goods.name = goods_detail["name"]#前端中是“¥232”,数据库中是float类型,所以要替换掉goods.market_price = float(int(goods_detail["market_price"].replace("¥", "").replace("元", "")))goods.shop_price = float(int(goods_detail["sale_price"].replace("¥", "").replace("元", "")))goods.goods_brief = goods_detail["desc"] if goods_detail["desc"] is not None else ""goods.goods_desc = goods_detail["goods_desc"] if goods_detail["goods_desc"] is not None else ""# 取第一张作为封面图goods.goods_front_image = goods_detail["images"][0] if goods_detail["images"] else ""#取最后一个category_name = goods_detail["categorys"][-1]# 取出当前子类对应的GoodsCategory对象,filter没有匹配的会返回空数组,不会抛异常。category = GoodsCategory.objects.filter(name=category_name)if category:goods.category = category[0]goods.save()for goods_image in goods_detail["images"]:goods_image_instance = GoodsImage()goods_image_instance.image = goods_imagegoods_image_instance.goods = goodsgoods_image_instance.save()

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

配置media路径

settings中

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

urls.py

# MxShop/urls.py
__author__ = 'derek'from django.urls import path,include
import xadmin
from django.views.static import serve
from MxShop.settings import MEDIA_ROOTurlpatterns = [path('xadmin/', xadmin.site.urls),path('ueditor/',include('DjangoUeditor.urls' )),#文件path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
]

目录结构

Django REST framework+Vue 打造生鲜超市(三)相关推荐

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

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

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

    代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 d ...

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

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

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

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

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

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

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

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

  7. Django进阶 Django REST framework+Vue 打造生鲜超市第一天 搭建环境

    新人学习django 是按照这个大佬的教程学习的 链接: https://www.cnblogs.com/derek1184405959/p/8733194.html. 很多步骤都是按照上面的教程学习 ...

  8. Django REST framework+Vue 打造生鲜电商项目(笔记八)

    (form:http://www.cnblogs.com/derek1184405959/p/8862569.html) 十一.pycharm 远程代码调试 第三方登录和支付,都需要有服务器才行(回调 ...

  9. python全栈生鲜电商_Django REST framework+Vue 打造生鲜电商项目(笔记十)

    (from:https://www.cnblogs.com/derek1184405959/p/8877643.html  有修改) 十三.首页.商品数量.缓存和限速功能开发 首先把pycharm环境 ...

最新文章

  1. SQLServer之ISO游标使用
  2. 苹果服务器修改主目录就打不开,苹果应用商店又挂了 App Store打不开怎么修复...
  3. MYSQL因为索引问题导致的死锁分析
  4. ROS知识[14]:安装ubuntu 18.04和eclipse+CDT(installer)
  5. 笔记-高项案例题-2013年下-计算题
  6. 跑三小时的monkey测试该怎么算_百亿次的锤炼 - 带逛Dragonboat的各类测试
  7. Gym102028G Shortest Paths on Random Forests 生成函数、多项式Exp
  8. javascript练习案例--消失的星星
  9. 第3关:HTML表格:日常消费账单表格展示网页
  10. 51单片机蓝牙小车程序详解
  11. 傅里叶变换的性质及证明(CTFT)
  12. 我的个人知识管理PKM
  13. 霍尼韦尔和陕西西咸新区签订投资战略协议;雀巢专业餐饮成都客户交流体验中心落成 | 美通企业日报...
  14. 宏转录组方法_土壤宏转录组RNA的提取方法评价
  15. linux常用的基本指令
  16. execjs 调用js出现找不到windows对象
  17. U3D控制摄像头第一人称WASD移动旋转
  18. Oracle数据库导入导出emp文件
  19. html列表详情页,如何区分一个页面是列表页还是详情页
  20. 核烧写及UBOOT调试经验总结

热门文章

  1. weblogic反序列化
  2. EAS中的EAS License与Apusic的License区别
  3. Python转换图像格式,超全
  4. 关于DSP320F28335步进电机控制几个问题
  5. python培训 马哥 黄哥
  6. 编译原理——说明语句翻译
  7. [AS/400] Control Language
  8. iPhone is not available. Please reconnect the device
  9. 谷歌手机pixel4 夜景_您应该购买Google Pixel 4a的5个理由
  10. 二维矩阵中行列元素互换(例题