Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(中)

简介: 文章目录一、项目初始化二、数据模型设计1.用户数据模型设计2.商品数据模型设计3.交易数据模型设计4.用户操作数据模型设计三、xadmin后台管理系统的配置四、数据迁移和数据导入1.migration原理和表的生成2.导入商品类别和商品数据

三、xadmin后台管理系统的配置

xadmin是一个Django自带后台管理工具的替代品,可以直接使用pip install xadmin命令安装,但是由于通过这种方式安装的官方版本对版本2.1及以后的Django支持不友好,因此可点击https://download.csdn.net/download/CUFEECR/12647622下载修改后的版本,并将其解压放入extra_apps下。

然后在4个apps下分别创建adminx.py,apps/goods/adminx.py如下:

import xadmin
from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner
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)

apps/trade/adminx.py如下:

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)

apps/user_operation/adminx.py如下:

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)

apps/users/adminx.py如下:

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 = "fresh_ec"
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)

将xadmin配置到settings.py中:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.users.apps.UsersConfig',
    'goods',
    'trade',
    'user_operation',
    'DjangoUeditor',
    'xadmin',
    'crispy_forms',
    'django.contrib.admin'
]

还需要安装xadmin的依赖包,从https://github.com/sshwsfc/xadmin/blob/master/requirements.txt可以看到,包括django、django-crispy-forms、django-import-export、django-reversion、django-formtools、future、httplib2和six,可以直接使用一条命令pip install django django-crispy-forms django-import-export django-reversion django-formtools future httplib2 six安装即可。


此外,还需要安装xlwt和xlsxwriter,这主要用于操作Excel文件、使功能更完善,直接使用命令pip install xlwt xlsxwriter安装即可。

最后还需要对xadmin进行数据映射,即执行makemigrations和migrate即可。


如果遇到ImportError: cannot import name 'six' from 'django.utils',可按照下面方法解决:



如果遇到以下报错:

forms.Field.__init__(self, required, widget, label, initial, help_text,
TypeError: __init__() takes 1 positional argument but 6 were given

可直接在xadmin\views\dashboard.py中将forms.Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs)改为forms.Field.__init__(self)即可。

如果遇到其他问题,可参考https://blog.csdn.net/CUFEECR/article/details/104031620进行解决。

进行映射后,再查询数据库:

+------------------------------------+                   
| Tables_in_fresh_ec                 |                   
+------------------------------------+                   
| auth_group                         |                   
| auth_group_permissions             |                   
| auth_permission                    |                   
| django_content_type                |                   
| django_migrations                  |                   
| django_session                     |                   
| goods_banner                       |                   
| goods_goods                        |                   
| goods_goodscategory                |                   
| goods_goodscategorybrand           |                   
| goods_goodsimage                   |                   
| trade_ordergoods                   |                   
| trade_orderinfo                    |                   
| trade_shoppingcart                 |                   
| user_operation_useraddress         |                   
| user_operation_userfav             |                   
| user_operation_userleavingmessage  |                   
| users_userprofile                  |                   
| users_userprofile_groups           |                   
| users_userprofile_user_permissions |                   
| users_verifycode                   |                   
| xadmin_bookmark                    |                   
| xadmin_log                         |                   
| xadmin_usersettings                |                   
| xadmin_userwidget                  |                   
+------------------------------------+                   
25 rows in set (0.01 sec)                                

显然,xadmin的数据表已经映射进数据库。

此时,还需要对xadmin配置访问路径,urls.py如下:

from django.conf.urls import url
import xadmin
urlpatterns = [
       url(r'^xadmin/', xadmin.site.urls),
]

此时还需要创建超级用户,在manage.py@Fresh Ecommerce窗口中执行createsuperuser命令,输入用户名、邮箱和密码后即可创建超级管理员。

然后访问http://127.0.0.1:8000/xadmin/如下:


显然,此时可以(用刚刚创建的用户名和密码)登录后台,但是网页语言还是英文,需要对settings.py进行设置如下:

LANGUAGE_CODE = 'zh-hans'  # 中文支持
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

apps/goods/apps.py如下:

from django.apps import AppConfig
class GoodsConfig(AppConfig):
    name = 'goods'
    verbose_name = '商品'

apps/trade/apps.py如下:

from django.apps import AppConfig
class TradeConfig(AppConfig):
    name = 'trade'
    verbose_name = '交易管理'

apps/user_operation/apps.py如下:

from django.apps import AppConfig
class UserOperationConfig(AppConfig):
    name = 'user_operation'
    verbose_name = '用户操作管理'

apps/user/apps.py如下:

from django.apps import AppConfig
class UsersConfig(AppConfig):
    name = 'apps.users'
    verbose_name = '用户管理'

此时再查看网页如下:



显然,此时已经变为中文,并且点击每个导航栏都能看到具体内容,并且可以进行导出数据等多种操作。

四、数据迁移和数据导入

1.migration原理和表的生成

在导航栏Tools选择点击Run manage.py Task…,在命令行中输入makemigrations并执行,执行完之后,可以看到每个app下的migrations均生成了0001_initial.py文件。

但是此时数据还并未真正映射到数据库中,还需要执行migrate命令来执行之前生成的Python文件来映射数据库。也可以在migrate后跟一个具体的app名称来对某个app进行数据库映射,如migrate users命令就只会映射users下的数据模型。


执行之后,数据库中已经创建出数据模型所对应的表,可以查询如下:

show tables;

打印:

+------------------------------------+
| Tables_in_fresh_ec                 |
+------------------------------------+
| auth_group                         |
| auth_group_permissions             |
| auth_permission                    |
| django_content_type                |
| django_migrations                  |
| django_session                     |
| goods_banner                       |
| goods_goods                        |
| goods_goodscategory                |
| goods_goodscategorybrand           |
| goods_goodsimage                   |
| trade_ordergoods                   |
| trade_orderinfo                    |
| trade_shoppingcart                 |
| user_operation_useraddress         |
| user_operation_userfav             |
| user_operation_userleavingmessage  |
| users_userprofile                  |
| users_userprofile_groups           |
| users_userprofile_user_permissions |
| users_verifycode                   |
+------------------------------------+
22 rows in set (0.00 sec)

可以看到,所有的表名称都是由两部分组成,前面是所在的app的名称,剩下的是模型名称的小写形式。


注意:

(1)映射完之后,再修改模型,还需要再次执行makemigrations和migrate命令再次同步表到数据库;

django_migrations表保存了每次映射所执行的Python文件,因此不能随意删改这个表中的数据和映射产生的Python文件,否则会对数据映射产生影响。

(2)一旦使用Django模型设计和修改数据模型,就不要再轻易使用MySQL管理工具如Navicat等来手动修改表结构,这样两边不一致会很容易出错。

相关文章
|
22天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
65 0
|
26天前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
36 2
|
21天前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
12 0
|
22天前
|
JavaScript 开发者 UED
Vue.js 错误处理与调试:跟上技术潮流,摆脱开发困扰,成为代码大神不是梦!
【8月更文挑战第30天】在 Vue.js 开发中,错误处理与调试至关重要。本文将对比 Vue 的全局错误捕获机制 `Vue.config.errorHandler` 和组件内 `watch` 监听数据变化的方式,并介绍 Vue 开发者工具、控制台打印 (`console.log`) 以及代码断点 (`debugger`) 等调试方法。此外,还将探讨如何通过自定义错误页面提升用户体验。通过这些技巧的对比,帮助开发者灵活选择适合的策略,确保应用稳定性和开发效率。
39 0
|
22天前
|
JavaScript 前端开发 API
全栈开发革命来临!Vue.js与Node.js联手,打造前后端无缝对接的奇迹之作!
【8月更文挑战第30天】在Web开发领域,前后端分离与协作至关重要。Vue.js以其轻量级和易用性深受前端开发者喜爱,而Node.js则以高性能和事件驱动特性在后端领域崭露头角。二者结合开启了全栈开发新篇章,通过RESTful API或GraphQL实现高效稳定通信。本文以示例说明如何使用Vue.js和Node.js构建全栈应用,从前端Vue组件到后端Express服务器,展示了数据获取与展示的全过程。这种组合提供了一种高效简洁的全栈开发方案,使开发者能更专注于业务逻辑实现。
45 0
|
22天前
|
JavaScript 前端开发 UED
揭秘Vue.js高效开发:Vue Router如何让单页面应用路由管理变得如此简单?
【8月更文挑战第30天】随着Web应用复杂性的增加,单页面应用(SPA)因出色的用户体验和高效的页面加载性能而备受青睐。Vue.js凭借简洁的语法和灵活的组件系统成为构建SPA的热门选择,其官方路由管理器Vue Router则简化了路由管理。本文通过实战示例介绍如何利用Vue Router实现高效的SPA路由管理,包括命名路由、动态路由及其核心优势。
12 0
|
22天前
|
存储 JavaScript 前端开发
【Vue.js的神秘力量】一键解锁:如何让Bootstrap和Vuex成为你的开发超能力?
【8月更文挑战第30天】Vue.js是一个轻量且灵活的JavaScript框架,易于上手且功能强大。为提高开发效率和应用交互性,常需集成第三方库。本文介绍如何在Vue.js项目中集成Bootstrap和Vuex,及其它常见第三方库。Bootstrap提供响应式设计和预制组件,通过安装插件和引入CSS/JS即可集成;Vuex作为官方状态管理库,通过安装并创建store来管理组件状态。此外,Vue.js还可轻松集成Axios和Vue Router等库,提升HTTP请求和页面路由功能。合理选择和集成第三方库能显著提升开发效率,但需保持代码可维护性和可读性。
16 0
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
|
1月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
|
13天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
48 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发