該項(xiàng)目的思路是利用將django的超級(jí)管理員登錄頁(yè)面改造成學(xué)生信息管理系統(tǒng)网持,因此沒有用到views.py和模板,該項(xiàng)目的文件結(jié)構(gòu)如下
- django-admin-demo # 項(xiàng)目所在文件夾祠饺,里面存放該項(xiàng)目需要的三方庫(kù)和項(xiàng)目
- django_demo # django項(xiàng)目所在文件夾诅岩,文件夾名隨便起声离,使用該命令創(chuàng)建 django-admin startproject django_demo
- django_demo # 這是一個(gè)python包章办,內(nèi)部所有文件都是上面命令創(chuàng)建出來(lái)的锉走,該包與前一個(gè)文件夾同名
- _init_.py # 申明包
- asgi.py # 作為你的項(xiàng)?的運(yùn)?在 ASGI 兼容的 Web 服務(wù)器上的入口。使? ASGI 來(lái)部署的時(shí)候使?藕届。
- settings.py # Django 項(xiàng)?的配置?件挪蹭。
- urls.py # Django 項(xiàng)?的 URL 聲明,就像你?站的“?錄”休偶。
- wsgl.py # 作為你的項(xiàng)?的運(yùn)?在 WSGI 兼容的Web服務(wù)器上的入口嚣潜。使?使? WSGI 進(jìn)?部署的時(shí)候使?。
- student.py # 使用 python manage.py startapp student ,生成一個(gè)student應(yīng)用
- migrations # 一個(gè)python包椅贱,目前發(fā)現(xiàn)時(shí)存放數(shù)據(jù)庫(kù)相關(guān)內(nèi)容
- __init__.py # 申明是個(gè)包
- admin.py # 自定義Django管理工具
- apps.py # Django應(yīng)用的配置文件
- models.py # 模型管理文件
- tests.py # 測(cè)試文件
- views.py # 視圖管理文件
- manage.py # ?個(gè)讓你?各種?式管理 Django 項(xiàng)?的命令??具
- venv # 虛擬環(huán)境文件
- requirements.txt # 管理三方庫(kù)文件
初始化應(yīng)用與數(shù)據(jù)庫(kù)
首先新建一個(gè)python項(xiàng)目django-admin-demo,在該目錄下創(chuàng)建一個(gè)requirements.txt只冻,內(nèi)容如下:
# 所需要的依賴
# web框架
django==3.2.4
django-bootstrap4==3.0.1
django-simpleui==2021.6.2
# 專門解決 多層嵌套頁(yè)面展示問(wèn)題
django-nested_admin==3.3.3
# 數(shù)據(jù)庫(kù)操作
pymysql==1.0.2
mysqlclient
sqlalchemy==1.4.18
# yaml文件操作
PyYaml
創(chuàng)建好后在pycharm中打開該文件庇麦,點(diǎn)擊pycharm上的按鈕下載所需三方庫(kù)
接下來(lái)在cmd窗口或pycharm的Teminal窗口中執(zhí)行下列操作。
- 構(gòu)建django項(xiàng)目
django-admin startproject django_demo
- 生成應(yīng)用
cd django_demo
python manage.py startapp student
- 在項(xiàng)目中注冊(cè)應(yīng)用喜德,打開項(xiàng)目包文件中的setting.py文件山橄,在INSTALLED_APPS列表中添加如下信息
INSTALLED_APPS = [
'student',
'simpleui',
'nested_admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles'
]
- 初始化數(shù)據(jù)庫(kù),這里django默認(rèn)使用的是sqlite3,我改為了mysql舍悯,將項(xiàng)目包中setting.py文件內(nèi)的DATABASES內(nèi)容改為
DATABASES = { # 這里使用mysql數(shù)據(jù)庫(kù)航棱,首先得連接,然后新建一個(gè)名為django-demo的schema
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django-demo',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
這里需要注意下萌衬,首先得創(chuàng)建好django-demo這個(gè)數(shù)據(jù)庫(kù)才能進(jìn)行下列操作
python manage.py migrate # 同步數(shù)據(jù)庫(kù)內(nèi)容/創(chuàng)建
python manage.py makemigrations # 構(gòu)建數(shù)據(jù)更新內(nèi)容
定義模型
models.py文件內(nèi)容如下
from django.db import models
# Create your models here.
from django.utils.html import format_html # 個(gè)人理解就是將format_html后跟的字符串以HTML輸出
class Student(models.Model):
"""
學(xué)員信息 [表定義饮醇,相關(guān)一些操作]
"""
studentName = models.CharField('學(xué)員姓名', max_length=255)
studentAge = models.IntegerField('學(xué)員年齡', null=True, blank=True)
class Meta: # 這里是Django的用法,給model定義元數(shù)據(jù)
verbose_name = '學(xué)員信息管理' # 給模型類起個(gè)別名
verbose_name_plural = '學(xué)員信息管理' # 指定模型的復(fù)數(shù)形式是什么
# 行級(jí)按鈕/操作定義 -- 處理一條記錄
def alert(self):
# 此處你想展示什么秕豫,就寫什么html代碼
btn = '<input type="button" value="點(diǎn)我彈出" onclick="javascript:alert(\''+self.studentName+'\');"/>'
# 返回一個(gè)html信息對(duì)象
return format_html(btn)
alert.short_description='操作'
def __str__(self): # 類中如果定義了__str__方法朴艰,print打印對(duì)象時(shí)就會(huì)輸出這個(gè)函數(shù)返回的字符串
return self.studentName
class Contact(models.Model):
"""
聯(lián)系方式表,和學(xué)生有關(guān)聯(lián)
"""
info = models.CharField('聯(lián)系方式', max_length=16)
Student = models.ForeignKey("Student", on_delete=models.CASCADE, verbose_name="學(xué)生信息")
class Meta:
verbose_name = '聯(lián)系方式'
verbose_name_plural = '聯(lián)系方式列表' # 復(fù)數(shù) -- 展示多個(gè)的時(shí)候
def __str__(self): # 類中如果定義了__str__方法混移,print打印對(duì)象時(shí)就會(huì)輸出這個(gè)函數(shù)返回的字符串
return ''
class ExamInfo(models.Model):
"""
考試信息表
"""
score = models.IntegerField('考試總分')
remark = models.CharField('備注', max_length=16)
Student = models.ForeignKey("Student", on_delete=models.CASCADE, verbose_name="學(xué)生信息")
class Meta:
verbose_name = '考試信息'
verbose_name_plural = '考試信息列表' # 復(fù)數(shù) -- 展示多個(gè)的時(shí)候
def __str__(self):
return ''
class ExamDetailInfo(models.Model):
"""
考試信息詳情表
"""
score = models.IntegerField('分?jǐn)?shù)')
className = models.CharField('科目', max_length=16)
ExamInfo = models.ForeignKey("ExamInfo", on_delete=models.CASCADE, verbose_name="考試記錄")
class Meta:
verbose_name = '考試詳情'
verbose_name_plural = '考試詳情' # 復(fù)數(shù) -- 展示多個(gè)的時(shí)候
def __str__(self):
return ''
在models.py中設(shè)計(jì)了Student祠墅、Contact、Examinfo歌径、ExamDetailInfo四張表毁嗦,其中Contact和ExamInfo的student字段為Student表的外鍵,ExamDetailInfo的ExamInfo字段是ExamInfo表的外鍵回铛,在Student表中添加了alert按鍵狗准,點(diǎn)擊后展示學(xué)生名克锣。
定義后臺(tái)文件
在admin.py文件中寫入如下
import nested_admin
from django.contrib import admin
# Register your models here.
from .models import Student, Contact, ExamInfo, ExamDetailInfo
# TabularInline 表格形式的展示,一行一行
class ContactAdmin(nested_admin.NestedTabularInline): # 聯(lián)系方式
# 指定要展示哪些內(nèi)容
list_display = ['id', 'info']
model = Contact
extra = 0 # 表格默認(rèn)展示幾行
class ExamDetailInfoAdmin(nested_admin.NestedTabularInline): # 考試詳情
model = ExamDetailInfo
extra = 0 # 表格默認(rèn)展示幾行
# NestedStackedInline 【上下排版】
class ExamInfoAdmin(nested_admin.NestedStackedInline): # 考試信息
model = ExamInfo
extra = 0 # 表格默認(rèn)展示幾行
inlines = [ExamDetailInfoAdmin]
# ModelAdmin 常規(guī)展示【上下排版】
class StudentAdmin(nested_admin.NestedModelAdmin): # 學(xué)員信息管理
"""
學(xué)員信息
"""
# 指定要展示哪些內(nèi)容
list_display = ['id', 'studentName', 'studentAge', 'alert']
model = Student
inlines = [ContactAdmin, ExamInfoAdmin] #-- 嵌套一個(gè) 聯(lián)系方式的維護(hù)頁(yè)面
actions = ['test_btn'] # 按鈕定義
@admin.action(permissions=['change']) # 權(quán)限定義
def test_btn(self, httprequest, queryset):
# 此處可以進(jìn)行數(shù)據(jù)庫(kù)操作等等...
print('請(qǐng)求信息:', httprequest)
print('頁(yè)面選擇的數(shù)據(jù)信息:', queryset)
self.message_user(httprequest, '執(zhí)行成功') # 彈出一個(gè)對(duì)話框給前端提示
test_btn.short_description = '執(zhí)行測(cè)試用例'
test_btn.confirm = '這是一個(gè)對(duì)話框驶俊,你確定要執(zhí)行這個(gè)按鈕的動(dòng)作嘛娶耍?'
admin.site.register(Student, StudentAdmin)
# admin.site.register(Contact, ContactAdmin) # 此頁(yè)面已經(jīng)被嵌套在學(xué)生信息界面,不需要獨(dú)立成為一個(gè)頁(yè)面了
在admin.py文件中對(duì)剛創(chuàng)建models.py中的表進(jìn)行自定義管理饼酿,一般表其對(duì)應(yīng)的自定義樣式的類命名為表名+Admin榕酒, list_display屬性可以指定該頁(yè)面的顯示,inlines可以指定某些信息在該表所在頁(yè)面內(nèi)部顯示
創(chuàng)建超級(jí)用戶
在cmd窗口或pycharm的teminal窗口中進(jìn)入到django_demo目錄中故俐,輸入
python manage.py createsuperuser
然后依次輸入用戶名想鹰、郵箱(可不填直接回車)、密碼药版、確定密碼辑舷,最后輸入y設(shè)置完畢,然后啟動(dòng)服務(wù)
python manage.py runserver
在瀏覽器中打開http://127.0.0.1:8000/admin/ ,得到界面
輸入剛剛設(shè)置好的用戶名和密碼槽片,登錄
界面目前還有英文何缓,因此在settings.py中LANGUAGE_CODE和TIME_ZONE字段的值改為
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
重新刷新界面,語(yǔ)言已設(shè)置為中文还栓,
這樣基本功能就完成了