【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统
上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧。
转载请注明出处:https://www.cnblogs.com/v88v/p/8909845.html
1、上传图片/文件等资源
有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方便教学管理。
首先,对demo/urls.py文件进行改造,给urlpatterns添加static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT):
urlpatterns = [
path(r'', xadmin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
然后在demo/settings.py文件中添加
# 指定上传位置
LOCATION = os.path.join('/', 'Users', 'babybus')
# 媒体文件根目录
MEDIA_ROOT = os.path.join(LOCATION, 'Media') ROOT_URL = '/' MEDIA_URL = '/media/'
上传图片涉及到路径的获取,在models.py文件中导入os模块
import os
在models.py文件的Students类中添加一个路径获取的方法及models.ImageField字段:
def get_photo(self, filename):
return os.path.join('photo', '%s_%s_%s_%s' % (self.class_name, self.name, self.id, os.path.splitext(filename)[1]))
photo = models.ImageField(verbose_name='照片', upload_to=get_photo, blank=True, null=True)
同时同步一下数据库操作,这样页面就多出一个照片上传的选项了,选择好照片并保存:

2、筛选、过滤、排序
1)筛选
今年学校的录取率爆满,生源特别好,要在一个数据库中找到对应的学生,必然需要用到搜索功能。
修改adminx.py文件,在StudentsAdmin类中添加:
search_fields = ('name', )

要是我们想通过班级或者学科来查找这个班级或者选修这门学科的所有学生,方法还会是一样的吗?我们先试试:
search_fields = ('name', 'class_name', 'subjects',)
结果,报错了:

这是怎么回事呢?原来,我们搜的“班级”和“学科”这两个字段一个是外键一个是含有多对多关系,Student模型中的这两个字段名称并不是其实际名称,要在字段后加“__”两个下划线,然后再添加外键或多对多关系实际的字段名:
search_fields = ('name', 'class_name__class_name', 'subjects__name',)

现在妥妥的了。
2)过滤:
如果只想查看学生表中的男生或者女生的信息,那就用到了过滤功能:
修改adminx.py文件,在StudentsAdmin类中添加:
list_filter = ('sex',)

3)排序:
如果想让学生按某字段的顺序来排序,同样我们需要在adminx.py文件中的StudentsAdmin类中添加ordering选项:
# 顺序排序
ordering = ('age', 'name', )
# 逆序排序,在前面加一个减号"-",例如按年龄倒序排列
ordering = ('-age',)
这表示同时按照年龄和姓名字段来排序。
二、定制网站信息
我们希望登录网站的时候,显示站点的名称,修改adminx.py文件,添加LoginViewAdmin类,并注册:
from xadmin.views.website import LoginView class LoginViewAdmin(LoginView):
title = '学生信息管理系统' xadmin.site.register(LoginView, LoginViewAdmin)

还可以继续修改,例如浏览器标题和左上角的网页标题以及页脚的版权信息:
from xadmin.views import CommAdminView
class GlobalSetting(CommAdminView):
# 左上角及浏览器标题
site_title = '学生信息管理系统'
# 页脚版权信息
site_footer = 'Copyright © 2018 宝宝巴士' xadmin.site.register(CommAdminView, GlobalSetting)

左侧边栏如果以后项目越来越多了,有一个归类会更好看些,也方便管理操作。这就需要在GlobalSetting类中添加
menu_style = 'accordion'

转载请注明出处:https://www.cnblogs.com/v88v/p/8909845.html
Xadmin入门就到此为止吧,在后续的博文中我会继续深入讲解Django+Xadmin的进阶用法和操作。
【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统的更多相关文章
- Django2.1,Xadmin2.0下的问题记录
此篇博文长期更新…… 环境: Ubuntu18.04, Python3.6, Django2.1, Xadmin2.0 1. Xadmin添加用户小组件时报错:xadmin render() got ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建
由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)
上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- springboot系列教程导学篇
spring boot2.0系列教程学习之导学篇 springboot 2.0深度学习系列教程. Spring Boot 虽然凯哥从2015年年初开始就接触了spring boot.但是在之后的公司中 ...
- spring cloud系列教程第六篇-Eureka集群版
spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...
- 学生信息管理系统v1.0
昨天一个教师朋友找到我,告诉我现在学期末他工作比较忙.需要统计处理很多学生信息,想让我帮他做一个管理系统.实现的功能就是把WPS表格转化成Word文档,将每一个学生的信息都能够分开,并且要根据名字找到 ...
- spring cloud系列教程第四篇-Eureka基础知识
通过前三篇文章学习,我们搭建好了两个微服务工程.即:order80和payment8001这两个服务.有了这两个基础的框架之后,我们将要开始往里面添加东西了.还记得分布式架构的几个维度吗?我们要通过一 ...
- spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息
spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...
随机推荐
- 数据恢复案例分享:MSSQL 2000 错误823
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
- 《javascript设计模式与开发实践》阅读笔记(16)—— 状态模式
状态模式 会区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变.比如电灯的开关是开还是关,在外界的表现就完全不同. 电灯例子 按照常规思路,实现一个电灯就是构造一个电灯类,然后指定一下它的 ...
- Java 持久化操作之 --io流与序列化
1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...
- mysql常用命令整理
#不压缩备份 mysqldump -u root -p userpassword databasename > /tmp/backupfile.sql #压缩备份 mysqldump -u ro ...
- Lock(三)查看是谁把表给锁了
查看是谁把表给锁了 select se1.inst_id as 被阻塞的会话节点, se2.inst_id as 罪魁祸首节点, se1.sid as 被阻塞的会话ID, ob.object_name ...
- 新概念英语(1-135)The latest report
Lesson 135 The latest report 最新消息 Listen to the tape then answer this question. Is Karen Marsh going ...
- mysql(2)—— 由笛卡尔积现象分析数据库表的连接
首先,先简单解释一下笛卡尔积. 现在,我们有两个集合A和B. A = {0,1} B = {2,3,4} 集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式: A×B = {(0,2 ...
- JavaScript中Global、Math、Date对象的常用方法
JavaScript当中Global.Math.Date类型常用方法如下: /* js 中 Global对象 是一个不存在的对象,它里面的方法可以调用 常用方法: 1 encodeURI 对uri进行 ...
- Lua中table的实现-《Lua设计与实现》
本文来自<Lua设计与实现>的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈 Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组 ...
- 关于 String,StringBuilder,StringBuffer
关于 String,StringBuilder,StringBuffer 的讨论,已有很多文章:在这里,我希望能刨根问底,更进一步的理解其中的原理. String String 是final类型,不可 ...