前言:
幫忙寫(xiě)一個(gè)成績(jī)管理系統(tǒng),哇......
要求:
- 能按班級(jí)、按課程完成對(duì)學(xué)生成績(jī)的增刪改查;
- 能按班級(jí)、按課程統(tǒng)計(jì)學(xué)生的成績(jī),能求總分、平均分,課程的不及格人數(shù)等;
- 能按班級(jí)、按課程對(duì)學(xué)生的成績(jī)進(jìn)行排序;
- 能查詢某名學(xué)生的成績(jī)。
嗯~ o( ̄▽ ̄)o,不管怎么看這都像是存粹的數(shù)據(jù)庫(kù)操作。
python 自帶 sqlite3,而且后臺(tái)傻瓜式操作數(shù)據(jù)庫(kù),最簡(jiǎn)單,就這個(gè)。
技術(shù)選型:Python3.6+Django2.x+Xadmin2.x
強(qiáng)力參考:
- Django docs
- xadmin
- 學(xué)生信息管理系統(tǒng) 這篇寫(xiě)好哦
環(huán)境搭建
安裝,當(dāng)然是跳過(guò)啊!
最后面有詳細(xì)依賴庫(kù),自己安裝去。
初始化操作
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ django-admin.exe startproject Django_simple #
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ python manage.py startapp app
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ mkdir templates && mkdir static
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ python manage.py migrate
初始目錄樹(shù):
eor@DESKTOP-CNB2LNA:/mnt/d/PRJ/student_management/Django_simple$ tree -L 2 --filelimit 20
.
├── app
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── Django_simple
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── static
└── templates
往 setting.py 添加模塊,注意添加自己的模塊,否則無(wú)法導(dǎo)入數(shù)據(jù)庫(kù):
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'xadmin',
'crispy_forms',
'app',
]
測(cè)試 xadmin 是否抽風(fēng)
作為后臺(tái)管理系統(tǒng),我們需要一個(gè)管理員,否則登陸不進(jìn)去,新建管理員:

登陸成功

添加中文支持
往 setting.py 中導(dǎo)入
from django.utils.translation import ugettext_lazy as _
然后修改 LANGUAGE_CODE 和 LANGUAGES:

<center>結(jié)果</cemter>

參考:廣告DN
使用數(shù)據(jù)庫(kù)
修改 models.py:
from django.db import models
# verbose_name 作為說(shuō)明注釋使用,可用于 csv 導(dǎo)出
class Student(models.Model):
name = models.CharField(verbose_name='姓名', max_length=50)
sex = models.CharField(verbose_name='性別', max_length=50)
age = models.IntegerField(verbose_name='年齡')
address = models.CharField(verbose_name='家庭住址', max_length=250)
enter_date = models.DateField(verbose_name='入學(xué)時(shí)間')
remarks = models.TextField(verbose_name='備注', blank=True)
需要明白的是,這里創(chuàng)建的是單個(gè)人物的數(shù)據(jù)模型,之后 Django 就能通過(guò)這個(gè)樣板模型來(lái)進(jìn)行數(shù)據(jù)的創(chuàng)建。
更新數(shù)據(jù)庫(kù):
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ python manage.py makemigrations && python manage.py migrate
每次更改 models.py 都要運(yùn)行一次 python manage.py makemigrations 和 python manage.py migrate。
啊,本質(zhì)上 orm 就是將原本直接硬寫(xiě)的 sql 語(yǔ)句換成了 python 語(yǔ)句來(lái)寫(xiě),這樣我們就不需要記憶那些難記的 sql 語(yǔ)句了,但是也因?yàn)閾Q成了 py 語(yǔ)句,所以我們需要手動(dòng)對(duì)我們的 py 語(yǔ)句進(jìn)行檢測(cè)改動(dòng),然后被 orm 轉(zhuǎn)換,最后作用于數(shù)據(jù)庫(kù)。
SQLiteStudio 查看更改:

編寫(xiě)控制臺(tái)信息
控制臺(tái)由 admin.py 控制,最后用 xadmin.site.register 來(lái)注冊(cè)上去。
# from django.contrib import admin
import xadmin
from app.models import *
class StudentsAdmin():
list_display = ('name', 'sex', 'age', 'address', 'enter_date', 'remarks',)
xadmin.site.register(Student, StudentsAdmin)
上傳圖片、附件,僅限開(kāi)發(fā)環(huán)境
添加相關(guān)目錄到 setting.py:
# 以下僅限開(kāi)發(fā)環(huán)境,這不適合生產(chǎn)使用!
# 媒體文件根目錄
MEDIA_URL = '/media/' # 網(wǎng)站的訪問(wèn)路徑
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # MEDIA_ROOT 為提供圖片的路徑
往 models.py 的內(nèi) student 類新加入一個(gè)圖片屬性并設(shè)置 upload_to,這將會(huì)被解釋為數(shù)據(jù)庫(kù)上傳圖片:
class Student(models.Model):
name = models.CharField(verbose_name='姓名', max_length=50)
sex = models.CharField(verbose_name='性別', max_length=50)
age = models.IntegerField(verbose_name='年齡')
address = models.CharField(verbose_name='家庭住址', max_length=250)
enter_date = models.DateField(verbose_name='入學(xué)時(shí)間')
remarks = models.TextField(verbose_name='備注', blank=True)
pass
def path_photo(self, filename):
return os.path.join('photo', '%s_%s' % (self.name, self.sex))
photo = models.ImageField(verbose_name='照片', upload_to=path_photo, blank=True, null=True) # upload_to指定圖片上傳的途徑,如果不存在則自動(dòng)創(chuàng)建
編寫(xiě) urls.py:
from django.contrib import admin
from django.urls import path
import xadmin
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path(r'', xadmin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
注意
此輔助函數(shù)僅在調(diào)試模式下有效,并且僅當(dāng)給定前綴是本地(例如/media/)而不是URL(例如 http://media.example.com/)時(shí)才有效。
配置完 Django 的后臺(tái)管理頁(yè)面就會(huì)自動(dòng)顯示上傳圖片的功能,網(wǎng)站訪問(wèn)時(shí)的相對(duì)路徑則由 MEDIA_URL 提供。
真素神奇,就跟配置文件一樣,這里面 TM 發(fā)生了什么?
測(cè)試:

導(dǎo)出依賴庫(kù)
不給完整依賴庫(kù)的都是大坑,節(jié)省時(shí)間乃是大事。
導(dǎo)出依賴庫(kù):
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ pip freeze > requirements.txt
安裝依賴:
pip install -r requirements.txt
看一眼,可以復(fù)制下來(lái)存到自己的 requirements.txt 里面安裝:
D:\PRJ\student_management\Django_simple (master -> origin)
(py36) λ cat requirements.txt
asn1crypto==0.24.0
astroid==2.0.1
autopep8==1.3.5
certifi==2018.8.13
cffi==1.11.5
colorama==0.3.9
cryptography==2.2.2
diff-match-patch==20121119
Django==2.1
django-crispy-forms==1.7.2
django-filter==2.0.0
django-formtools==2.1
django-import-export==1.0.1
django-reversion==3.0.0
djangorestframework==3.8.2
et-xmlfile==1.0.1
future==0.16.0
httplib2==0.9.2
idna==2.7
isort==4.3.4
jdcal==1.4
Jinja2==2.10
lazy-object-proxy==1.3.1
Markdown==2.6.11
MarkupSafe==1.0
mccabe==0.6.1
mysqlclient==1.3.13
odfpy==1.3.6
openpyxl==2.5.5
Pillow==5.2.0
pycodestyle==2.4.0
pycparser==2.18
pylint==2.0.1
PyMySQL==0.9.2
pytz==2018.5
PyYAML==3.13
six==1.11.0
tablib==0.12.1
typed-ast==1.1.0
unicodecsv==0.14.1
wincertstore==0.2
wrapt==1.10.11
xadmin==2.0.1
xlrd==1.1.0
xlwt==1.3.0