目錄javascript
生鮮超市(十) 生鮮超市(十一) 生鮮超市(十二) 生鮮超市(十三) java
代碼下載node
githubpython
教程git
學習自慕課網-前端vue結合後端DjangoFramework的在線生鮮超市 github
(1)xadmin/plugins文件夾下新建文件ueditor.py數據庫
代碼以下:
# xadmin/plugins/ueditor.py import xadmin from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView from DjangoUeditor.models import UEditorField from DjangoUeditor.widgets import UEditorWidget from django.conf import settings class XadminUEditorWidget(UEditorWidget): def __init__(self, **kwargs): self.ueditor_options = kwargs self.Media.js = None super(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().widget param = {} param.update(widget.ueditor_settings) param.update(widget.attrs) return {'widget':XadminUEditorWidget(**param)} return attrs def 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__.py PLUGINS = ( 'ueditor', )
配置xadmin和ueditor的路由
# MxShop/urls.py import xadmin from django.urls import path,include urlpatterns = [ path('xadmin/', xadmin.site.urls), path('ueditor/', include('DjangoUeditor.urls')), ]
四個app下面都新建文件adminx.py,而後分別註冊到後臺
(1)users/adminx.py
# users/adminx.py __author__ = 'derek' import xadmin from xadmin import views from .models import VerifyCode class BaseSetting(object): #添加主題功能 enable_themes = True use_bootswatch = True class 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.py from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' #app名字後臺顯示中文 verbose_name = "用戶管理"
還須要__init__.py中修改默認配置才生效
# users/__init__.py default_app_config = 'users.apps.UsersConfig'
其它三個app同樣的操做
(2)goods/adminx.py
# goods/adminx.py import xadmin from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner, HotSearchWords from .models import IndexAd class 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 = GoodsImage exclude = ["add_time"] extra = 1 style = '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 context class 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.py from django.apps import AppConfig class GoodsConfig(AppConfig): name = 'goods' verbose_name = '商品管理'
# good/__init__.py default_app_config = 'goods.apps.GoodsConfig'
(3)trade/adminx.py
# trade/adminx.py __author__ = 'derek' import xadmin from .models import ShoppingCart, OrderInfo, OrderGoods class 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 = OrderGoods exclude = ['add_time', ] extra = 1 style = 'tab' inlines = [OrderGoodsInline, ] xadmin.site.register(ShoppingCart, ShoppingCartAdmin) xadmin.site.register(OrderInfo, OrderInfoAdmin)
# trade/apps.py from django.apps import AppConfig class TradeConfig(AppConfig): name = 'trade' verbose_name = '交易管理'
# trade/__init__.py default_app_config = 'trade.apps.TradeConfig'
(4)user_operation/adminx.py
# user_operation/adminx.py __author__ = 'derek' import xadmin from .models import UserFav, UserLeavingMessage, UserAddress class 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.py from django.apps import AppConfig class UserOperationConfig(AppConfig): name = 'user_operation' verbose_name = '操做管理'
# user_operation/__init__.py default_app_config = 'user_operation.apps.UserOperationConfig'
(5)生成數據庫表
python manage.py makemigrations
python manage.py migrate
因爲分類和商品不少,就寫個腳本導入數據
單獨使用django的model,批量導入數據
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 GoodsCategory from 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 = 2 lev2_intance.parent_category = lev1_intance lev2_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 = 3 lev3_intance.parent_category = lev2_intance lev3_intance.save()
而後運行腳本 import_category_data.py 數據就能夠保存到數據庫了
在data目錄下新建import_goods_data.py
import sys import os pwd = 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, GoodsImage from db_tools.data.product_data import row_data for 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_image goods_image_instance.goods = goods goods_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_ROOT urlpatterns = [ path('xadmin/', xadmin.site.urls), path('ueditor/',include('DjangoUeditor.urls' )), #文件 path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}), ]
目錄結構