详细django框架+SIMPLEUI+import_export设计web管理后台(四)

news2024/11/17 3:57:13

目录

1.项目简介

2.搭建django框架

3.引入 SIMPLEUI插件

3.1安装simpleui

3.2 修改设置

3.3 克隆静态资源

3.4登陆测试

 4.优化页面

4.1 修改后台名称显示

4.2 增加页面LOGO图标

4.3增加网址图标:目前主要的浏览器都支持favicon.ico图标

 4.4 修改APP名称显示

 4.5 修改模型名称

4.6 去掉右侧Simpleui的广告

 4.7 自定义首页

 4.8 自定义菜单

1.项目简介

在windows系统,使用pycharm软件,利用python的web开发框架django,来搭建一个公司后台管理系统。实现于Windows系统。

2.搭建django框架

参考:Python-web框架-Django创建一个应用(简单的博客)详细步骤总结(一)

3.引入 SIMPLEUI插件

3.1安装simpleui

Terminal终端输入:pip install django-simpleui

3.2 修改设置

打开mypro/settings.py,找到INSTALLED_APPS,在第一行添加simpleui:

 找到DEBUG,修改为False,并添加以下语句:

DEBUG = False

ALLOWED_HOSTS = ['*']

STATIC_ROOT = os.path.join(BASE_DIR, "static")

3.3 克隆静态资源

Terminal终端执行:

python manage.py collectstatic

出现下图则说明克隆成功:

 注意:如果出现以下错误,显示路径不存在:

?: (staticfiles.W004) The directory 'D:\pythonProject\mypro\static' in the STATICFILES_DIRS setting does not exist.

解决办法:先屏蔽掉settings.py中的这句代码,再执行克隆语句。

3.4登陆测试

启动服务器,从浏览器进入 http://127.0.0.1:8000/admin,出现以下页面则引入成功:

 

 4.优化页面

4.1 修改后台名称显示

打开mypro/myblog/admin.py文件,并修改代码:

from django.contrib import admin    #导入admin
from myblog import models           #导入数据模型

class BlogPostAdmin(admin.ModelAdmin):
    #list_display = ('pk','title','body','timestamp') #设置要显示的属性,pk为索引。
    admin.site.site_header = '公司信息管理后台'  # 设置header
    admin.site.site_title = '公司信息管理后台'  # 设置title
    admin.site.index_title = '公司信息管理后台'

admin.site.register(models.BlogPost, BlogPostAdmin)  #使用admin注册BlogPostAdmin类

4.2 增加页面LOGO图标

在mypro/settings.py中添加代码,注意,此处的LOGO指登陆页面的LOGO。

SIMPLEUI_LOGO ='https://profile-avatar.csdnimg.cn/fae946d95e034681ace1db3233541608_qiujin000.jpg!1'

 上边的图标可以自行更换,或将图片放入mypro/myblog/static/img/目录下。

启动服务器,重新登陆,登陆界面的logo和名称已改变: 

4.3增加网址图标:目前主要的浏览器都支持favicon.ico图标

(在线制作ico图标 | 在线ico图标转换工具 方便制作favicon.ico - 比特虫 - Bitbug.net 

打开mypro/url.py,添加url路径:

url(r'^favicon\.ico$',RedirectView.as_view(url=r'/static/img/favicon.ico'))

(我的favicon.ico图片存在mypro/myblog/static/img/目录下,目录不同的话需要自行更改)

 刷新浏览器界面,网址图标已改变:

更改之前是这样:

更改之后是这样,加上了绿色那个图标:

 

(注意: 如果刷新页面,ico图标没有出现,则清空浏览器历史记录,然后关闭所有的浏览器界面。再重新输入网址登录,图标就会重新进行加载,出现。亲测有效。)

 4.4 修改APP名称显示

打开mypro/myblog/apps.py文件,并添加代码:

from django.apps import AppConfig


class MyblogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myblog'

    verbose_name = '公司人员管理'  # 修改页面显示为中文

刷新浏览器界面,已改变:

 4.5 修改模型名称

打开mypro/myblog/models.py文件,并修改BlogPost模型代码:

class BlogPost(models.Model):
    # title = models.CharField(max_length=150) #博客的标题
    # body = models.TextField()    #博客正文
    # timestamp = models.DateTimeField() #博客创建时间

    name = models.CharField(verbose_name="Task name", max_length=65, unique=True, default=None)

    class Meta:
        verbose_name = "人员"
        verbose_name_plural = "人员列表"  #模型类的复数名

    def __str__(self):
        return self.name

刷新界面,如下,已改变: 

4.6 去掉右侧Simpleui的广告

打开mypro/settings.py,添加以下代码:

SIMPLEUI_HOME_INFO = False  #隐藏右侧simple广告链接
SIMPLEUI_ANALYSIS = False   #隐藏右侧simple使用分析

刷新界面,已改变:

 4.7 自定义首页

打开mypro/settings.py,添加以下代码:(指向的页面可以换成与自己主题匹配的页面网址)

图标网址:Find the Perfect Icon for Your Project in Font Awesome 5 | Font Awesome

#修改左侧菜单首页设置
SIMPLEUI_HOME_PAGE = 'https://blog.csdn.net/qiujin000?spm=1010.2135.3001.5421' #指向页面
SIMPLEUI_HOME_TITLE = 'CSDN欢迎你'  #首页标题
SIMPLEUI_HOME_ICON = 'fa fa-code' #首页图标
#设置右上角home图标跳转链接,会以另外一个窗口打开
SIMPLEUI_INDEX = 'https://blog.csdn.net/qiujin000?spm=1010.2135.3001.5421'
#隐藏首页的快捷操作和最近动作
SIMPLEUI_HOME_QUICK = False
SIMPLEUI_HOME_ACTION = False

刷新浏览器页面 ,首页切换为了CSDN。

 4.8 自定义菜单

因为是打算建立一个公司管理后台,所以根据这个题目更改菜单。

打开mypro/settings.py,添加以下代码:

SIMPLEUI_CONFIG = {
    'system_keep': False,  # 关闭系统菜单
    'menu_display': ['行政管理', '研发管理','高层管理', '认证和授权'],
    'dynamic': True,    # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
    'menus': [{
        'app': 'myblog',
        'name': '行政管理',
        'icon': 'fas fa-x-ray',
        'models': [{
            'name': '人员信息',
            'icon': 'fa fa-user',
            'url': 'myblog/person/'
        }, {
            'name': '工作计划',
            'icon': 'el-icon-video-camera-solid',
            'url': 'myblog/job_plan/',
        }]},
        {
        'app': 'myblog',
        'name': '研发管理',
        'icon': 'fab fa-app-store-ios',
        'models': [{
            'name': '人员信息',
            'icon': 'fa fa-user',
            'url': 'myblog/person1/'
        }, {
            'name': '工作计划',
            'icon': 'el-icon-video-camera-solid',
            'url': 'myblog/job_plan1/',
        }]},
        {
        'app': 'myblog',
        'name': '高层管理',
        'icon': 'fa fa-th-list',
        'models': [{
            'name': '人员信息',
            'icon': 'el-icon-message-solid',
            'url': 'myblog/person2/'
        }, {
            'name': '工作计划',
            'icon': 'el-icon-picture',
            'url': 'myblog/job_plan2/'
        }
        ]},
        {
        'app': 'auth',
        'name': '认证和授权',
        'icon': 'fas fa-shield-alt',
        'models': [{
            'name': '用户',
            'icon': 'far fa-user',
            'url': 'auth/user/'
        }, {
           'name': '组',
           'icon': 'fas fa-users-cog',
            'url': 'auth/group/',
        }]
    }]
}

 以上代码中的icon图标代表每个菜单对应的图标,可以在以下网站查询:Find the Perfect Icon for Your Project in Font Awesome 5 | Font Awesome

刷新浏览器页面,已更新:

 但子菜单(人员信息、工作计划)点击进去会显示错误404,因为还没有建立响应模型,需要

根据settings.py中models的url路径,建立相关模型,打开mypro/myblog/models.py,添加模块:

import django.utils.timezone as timezone

再添加代码: 

#人员信息
class person(models.Model):
    gender1 = '01'
    gender2 = '02'
    gender_DEFAULT = '03'

    GENDER_CHOICES = (
        (gender1, '男'),
        (gender2, '女'),
        (gender_DEFAULT, '不明'),
    )

    CREATED_BY = models.CharField('创建人',max_length=32)
    CREATED_TIME = models.DateTimeField('创建时间',default=timezone.now)
    UPDATED_BY = models.CharField('更新人',max_length=32)
    UPDATED_TIME = models.DateTimeField('更新时间',default=timezone.now)
    name = models.CharField('姓名', max_length=32)
    gender = models.CharField('性别',max_length=32,
                                choices= GENDER_CHOICES,
                                default= gender_DEFAULT
                                )

    job_name = models.CharField('岗位名称',max_length=128)
    job_content = models.CharField('工作内容', max_length=1024)
    entry_time = models.CharField('入职时间',max_length=32)
    job_place = models.CharField('工作地点',max_length=32)
    pay_grade = models.CharField('薪资等级',max_length=32)
    is_depart = models.CharField('是否离职', max_length=128)

#工作计划
class job_plan(models.Model):
    ## 定义枚举值状态
    weight1 = '01'
    weight2 = '02'
    weight_DEFAULT = '03'
    status1 = '04'
    status2 = '05'
    status_DEFAULT = '06'

    weight_CHOICES = (
        (weight1, '20%'),
        (weight2, '30%'),
        (weight_DEFAULT, '50'),
    )
    status_CHOICES = (
        (status1, 'A'),
        (status2, 'B'),
        (status_DEFAULT, 'C'),
    )


    CREATED_BY = models.CharField('创建人',max_length=32)
    CREATED_TIME = models.DateTimeField('创建时间',default=timezone.now)
    UPDATED_BY = models.CharField('更新人',max_length=32)
    UPDATED_TIME = models.DateTimeField('更新时间',default=timezone.now)
    start_time = models.CharField('起始时间', max_length=32)
    finish_time = models.CharField('预计完成时间', max_length=128)
    key_goals = models.CharField('关键目标', max_length=128)
    check_plan = models.CharField('考核计划', max_length=32)
    measurement= models.CharField('衡量方式', max_length=32)
    goal = models.CharField('目标值', max_length=128)
    weight = models.CharField('项目权重',max_length=32,
                                choices= weight_CHOICES,
                                default= weight_DEFAULT
                                )
    finish_status = models.CharField('完成等级',max_length=32,
                                choices= status_CHOICES,
                                default= status_DEFAULT
                                )
    adjusting= models.TextField('调整记录',max_length=32)

接下来还要去mypro/myblog/admin.py中进行模型注册,添加模块:

from import_export.admin import ImportExportModelAdmin
from blog.resource import personResource

然后添加代码: 

class personAdmin(ImportExportModelAdmin):
   resource_class = personResource
   list_display = ('CREATED_TIME','name','gender','job_name',
                   'job_content', 'entry_time',
                   'job_place', 'pay_grade','is_depart')
   list_display_links = ('job_name',)
   list_filter = ('gender', 'CREATED_TIME',)
   list_per_page = 10
   list_editable = ('job_content',)
   ordering = ('-CREATED_TIME',)
   search_fields = ('name',)
   actions = ['custom_button', 'upload_file']
   fieldsets = (
      ('基本信息', {
         'fields': ('CREATED_TIME','name','gender','job_name',
                   'job_content', 'entry_time',
                   'job_place', 'pay_grade','is_depart')
      })),

class job_planAdmin(admin.ModelAdmin):
   list_display = ('CREATED_TIME','start_time','finish_time','key_goals',
                   'check_plan', 'measurement','goal',
                   'weight', 'finish_status','adjusting')
   list_display_links = ('weight',)
   list_filter = ('start_time', 'CREATED_TIME',)
   list_per_page = 10
   list_editable = ('finish_time','adjusting')
   ordering = ('-CREATED_TIME',)
   search_fields = ('name',)
   actions = ['custom_button', 'upload_file']
   fieldsets = (
      ('基本信息', {
         'fields': ('CREATED_TIME','start_time','finish_time','key_goals',
                   'check_plan', 'measurement','goal',
                   'weight', 'finish_status','adjusting')
      }),)

admin.site.register(models.person,personAdmin)
admin.site.register(models.job_plan,job_planAdmin)

此时会出现错误:no module named myblog.resource,需要去mypro/myblog下新建文件resource.py,并添加以下代码:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mypro.settings')
django.setup()

from import_export import resources
#from blog import models
from myblog.models  import person

class personResource(resources.ModelResource):

    class Meta:
        model = person

注意,此时刷新界面会出现错误:django.db.utils.OperationalError: no such table: myblog_person

因为更改完models.py需要重新生成数据库表并迁移,重新执行以下两条命令:

python manage.py makemigrations
python manage.py migrate

此时可能出现错误:django.db.utils.IntegrityError: NOT NULL constraint failed: new__myblog_blogpost.name

解决办法:1.找到应用下的migrations目录,删除刚刚生成的迁移文件,如果不知道该删除哪个,就看日期,文件时间和你目前的操作时间接近的,就是需要删除的,比如这里是0002文件。

2.进入_pycache_目录,同理删除其中的0002文件。

3.进入mypro/,删除db.sqlite3文件。

此时重现执行:

python manage.py makemigrations
python manage.py migrate

成功: 

因为删除了之前的数据库表,所以用户信息也被删除,需要重新注册:

python manage.py createsuperuser

 按步骤建好用户后,重新启动服务器:

python manage.py runserver

浏览器输入对应网址,重新登陆,点击子菜单,又出现错误:

django.template.exceptions.TemplateDoesNotExist:admin/import_export/change_list_import_export.html

解决办法:

打开mypro/settings.py,找到INSTALLED_APPS项,在末尾添加'import_export' :

 刷新界面,即可正常运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用摄像头实现识别道路中的车道线、行人与车辆检测(级联分类器、HOG+SVM、行人检测)

基于树莓派的智能小车,用摄像头实现识别道路中的车道线识别、行人检测与车辆检测。 本项目旨在开发一套基于摄像头的智能道路环境感知系统,该系统能够实时识别道路中的车道线、行人与车辆,为自动驾驶汽车、智能交通管理以及辅助驾驶系统提供关…

Go语言数据类型--常量、iota枚举、数据类型分类

变量:程序运行期间,可以改变的量,变量声明需要var关键字。 常量:程序运行期间,不可以改变的量,变量声明需要const关键字。 自动推导 常量的自动推导不能加:; 不同类型数据的声明 可以使用…

华为OD机试 - 表演赛游戏分组 - 动态规划(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

目标检测算法讲解:从传统方法到深度学习,全面解析检测技术的演进与应用!

在计算机视觉领域,目标检测是一个基本且关键的任务,它不仅涉及图像中对象的识别,还包括确定这些对象的具体位置。这一任务通常通过算法来实现,这些算法能够识别出图像中的一个或多个目标,并给出每个目标的类别和位置。…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能,都是由BeanFactory的实现类来实现的。(DefaultListableBeanFactory) DefaultListableBeanFactory管理单例对象DefaultSinglet…

第11章 规划过程组(11.6规划进度管理)

第11章 规划过程组(二)11.6规划进度管理,在第三版教材第385页;#软考中级##中级系统集成项目管理师# 文字图片音频方式 第一个知识点:主要输出 1、进度管理计划 准确度 定义活动持续时间估算的可接受区间&#xff0…

springboot拦截器,ThreadLocal(每个线程的公共区域)

拦截器 配置信息(拦截所有请求) 其实这种可以作为springAOP作日志记录

flask数据连接池、定制命令

【 一 】数据库连接池 【 1 】flask操作mysql 基本的使用不使用连接池 from flask import Flask, jsonify import pymysqlapp Flask(__name__) app.debug Trueapp.route(/) def index():conn pymysql.connect(userroot,password"123123",host127.0.0.1,databas…

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件:确保您使用的是 MySQL 8.0 或更高版本,因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明:设置 location 为 point 类型 #…

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种,分别是读文件、网口监听(af-packet原始套接字)。两种方式在包获取上,都是通过读文件的形式;存在文件io操作,在专门处理大流量的情境下, 我们复用wireshark去做…

DNS访问百度

DNS,英文全称是 domain name system,域名解析系统,它的作用也很明确,就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址,找到就直接返回&…

【NOI-题解】1326. 需要安排几位师傅加工零件1228. 排队打水问题1229. 拦截导弹的系统数量求解

文章目录 一、前言二、问题问题:1326. 需要安排几位师傅加工零件问题:1228. 排队打水问题问题:1229. 拦截导弹的系统数量求解 三、感谢 一、前言 本章节主要对贪心问题进行讲解,包括《1326. 需要安排几位师傅加工零件》《1228. 排…

【嵌入式】探索嵌入式世界:在ARM上构建俄罗斯方块游戏的奇妙之旅

文章目录 前言:1. 简介2. 总体设计思路及功能描述2.1 设计思路2.2 功能描述2.3 程序流程图 3. 各部分程序功能及详细说明3.1 游戏界面函数3.1.1 游戏界面中的图片显示3.1.2 游戏开始界面3.1.3 游戏主界面3.1.4 游戏结束广告界面3.1.5 游戏界面中的触摸反馈3.1.6 游戏…

关于 Mybatis 的开启二级缓存返回对象不一致问题

做实验报告的时候&#xff0c;跟着学习&#xff0c;发现我已经将 开启 二级缓存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;说明对象不一致&#xff0c;二级缓存命中失败。 跟着流程配置&#xff1a; mybatis-config <settings><!-- 启用 myba…

mst[讲课留档]

最小生成树(Minimum Spanning Tree) (1)概念 我们知道&#xff0c;树是有 n n n个结点&#xff0c; n − 1 n-1 n−1条边的无向无环的连通图。 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的 n n n个顶点&#xff0c;但只有构成一棵树的 n − 1 n-1 …

实验五 计数器的设计与仿真

仿真 链接&#xff1a;https://pan.baidu.com/s/1N1nR39Gws59laVZY2slzBw 提取码&#xff1a;01ct 一、实验目的 1、通过实验&#xff0c;能熟悉QUARTUS开发环境&#xff0c;能够掌握VHDL设计电路&#xff0c;掌握使用相关仿真工具进行功能和时序仿真的方法&#xff1b; 2、通…

.js.map文件泄露/Springboot信息泄露

目录 框架识别 Webpack 简述 .js.map文件泄露 利用 Spring boot 很多网站都使用的是现有的框架进行开发的&#xff0c;因此相当于很多目录和文件的路径都是开源可知的&#xff0c;因此我们就可以直接访问对应的路径&#xff0c;如果网站没有进行限制就有可能会导致敏感信…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…

Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??

我们今天来说说本地用户提权的操作&#xff0c;我们在有webshell过后我们要进行进一步的提权操作&#xff0c;要不然对我们后期的内网渗透会有一些阻碍的操作。比如说我们使用mimikatz来进行抓取密码&#xff0c;就不能够成功。 Administrators与system的区别 我们来说说Admin…