【Python3.6+Django2.0+Xadmin2.0系列教程之二(入門篇-中)】學生信息管理系統


上一篇我們已經創建好了一個Xadmin的基礎項目,現在我們將在此基礎上構建一個同樣很基礎的學生信息管理系統。


 轉載請注明出處:https://www.cnblogs.com/v88v/p/8886764.html

 

一、創建模型

模型是表示我們的數據庫表或集合類,並且其中所述類的每個屬性是表或集合的字段,在 app/models.py 中定義

 

1、首先,導入models模塊

from django.db import models

接下來創建個學生信息類,其中包含學生姓名、性別、年齡、入學時間、家庭住址等信息:

class Students(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, blank=True)
    enter_date = models.DateField(verbose_name='入學時間')
    remarks = models.TextField(verbose_name='備注', blank=True)

在終端內執行這兩個數據庫修改同步的命令

python3 manage.py makemigrations
python3 manage.py migrate

現在看看數據庫,已經有了這張我們已經創建好的表及相關字段:

 

2、創建好數據表之后,接下來要將數據模型展示到頁面

首先,將app/admin.py文件重命名為adminx.py,並導入模塊

import xadmin
from .models import *

在前面我們已經創建好了一張包含學生姓名、性別、年齡、入學時間、家庭住址等信息的數據表,現在如果想要讓其中的學生姓名、性別、年齡、入學時間顯示在界面上,那就要創建一個類,其中的 list_display 屬性包含需要展示在頁面的相關字段:

class StudentsAdmin(object):
    list_display = ('name', 'sex', 'age', 'address',)

最后,對其進行注冊:

xadmin.site.register(Students, StudentsAdmin)

來看看頁面長得是這樣子的:

 

3、本地化語言顯示

是否發現左側欄目顯示的還是Students,咦,不對,怎么會是Students呢?原因就在於,英文單詞有單數和復數之分,左側這一欄默認是以類名最后加's'作為復數顯示的。那我們想要把它改為中文,要怎么做呢?接下來,就來操作:

在models.py的Students類下添加類屬性:

class Students(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, blank=True)
    enter_date = models.DateField(verbose_name='入學時間')
    remarks = models.TextField(verbose_name='備注', blank=True)

    class Meta:
        verbose_name = '學生信息'
        verbose_name_plural = '學生信息'

    def __str__(self):
        return self.name

 

 4、下拉選項

到這里,我們會發現在添加學生信息的時候,其中有一個性別字段,每次都要手動輸入“男”/“女”,要是弄成下拉選擇框,那就省事了,有辦法:

在Students類里添加

    SEX = (
        ('male', ''),
        ('female', '')
    )

然后修改sex字段

修改前:

sex = models.CharField(verbose_name='性別', max_length=50)

修改后:

sex = models.CharField(choices=SEX, verbose_name='性別', max_length=50)

同時,記得對模型的修改操作,凡是有涉及到數據庫的,都要進行同步操作,運行命令:

python3 manage.py makemigrations
python3 manage.py migrate

 

*有了學生信息之后,還需要添加個學生所屬的班級信息。同樣的,在models.py里添加一個班級類:

class Class(models.Model):
    class_name = models.CharField(verbose_name='班級', max_length=100)

    class Meta:
        verbose_name = '班級'
        verbose_name_plural = '班級'

    def __str__(self):
        return self.class_name

*注意,這兩個類必須寫在Students類的上面,否則無法被Students類識別

還是一樣,修改adminx.py,對這兩個類進行注冊和頁面自定義展示操作:

class ClassAdmin(object):
    list_display = ('class_name',)


xadmin.site.register(Class, ClassAdmin)

 

這里我們先把班級信息給填寫完整,之后需要對Students類關聯這這兩張表

 

*外鍵的操作:

在Students類里添加:

    grade_name = models.ForeignKey(Grade, verbose_name='所在年級', on_delete=models.CASCADE, blank=True, null=True)
    class_name = models.ForeignKey(Class, verbose_name='所在班級', on_delete=models.CASCADE, blank=True, null=True)

這里的ForeignKey代表使用外鍵,用到的是我們上面創建好的年級和班級這兩張表的信息,blank=True和null=True代表可以為空,非必填字段。

使用數據庫同步命令:

python3 manage.py makemigrations
python3 manage.py migrate

 

學生需要有他要學習的課程,現在我們就來創建課程的數據表,同樣的需要寫在學生表前面:

models.py文件內添加:

class Subjects(models.Model):
    name = models.CharField(verbose_name='課程名稱', max_length=50, blank=True)
    score = models.IntegerField(verbose_name='學分', blank=True)

    class Meta:
        verbose_name = '課程信息'
        verbose_name_plural = '課程信息'

    def __str__(self):
        return self.name

adminx.py文件內添加:

class SubjectsAdmin(object):
    list_display = ('name', 'score',)


xadmin.site.register(Subjects, SubjectsAdmin)

 

*多對多關系:

一個學生需要選修的課程一般不少於1門,那就需要用到多對多關系:

修改Student類,添加一個選修課程字段:

subjects = models.ManyToManyField(Subjects, verbose_name='選修課程')

同步一下數據庫信息,方法前面提到,這里不再贅述。

 

我們看到的選修課程的選項似乎有點丑,而且一旦選擇了就無法取消。這就需要對adminx.py進行修改,自定義顯示風格:

在StudentsAdmin內中添加一個內聯復選框:

style_fields = {'subjects': 'checkbox-inline', }

這里要注意一個地方,剛才我們在Students類中創建subjects字段時,沒有設置其為非必填字段,這里就會導致必須勾選了所有選項之后才讓保存。所以,正確的做法應該是要修改Students中的subjects字段,加入blank=True

subjects = models.ManyToManyField(Subjects, verbose_name='選修課程', blank=True)

(xadmin2.0貌似有個bug,這里本來應該顯示橫排的復選框,但是卻顯示成了豎着的,在Django1.x+xadmin0.6的組合里使用顯示是正常的)

 

有了學生之后,我們再來創建教師信息表:

models.py文件中加入:

class Teachers(models.Model):
    name = models.CharField(verbose_name='教師姓名', max_length=50)

    class Meta:
        verbose_name = '教師信息'
        verbose_name_plural = '教師信息'

    def __str__(self):
        return self.name

adminx.py文件中加入:

class TeachersAdmin(object):
    list_display = ('name',)


xadmin.site.register(Teachers, TeachersAdmin)

不要忘記了同步數據庫。

 

*一對一關系:

  假設學校規定,一個教師只能擔任一個班級的班主任,那就需要用到一對一關系:

修改models.py的Class表,添加headmaster字段:

headmaster = models.OneToOneField(Teachers, verbose_name='班主任', on_delete=models.CASCADE, blank=True, null=True)

這里的OneToOneField就是一對一關系了,執行數據庫同步命令。

現在在頁面上的班級信息里選擇班主任,一個班主任在被一個班級選定之后,其他班級是無法再選擇的:

 

總結:

看了上述操作是不是很簡單呢?確實,一點難度都沒有,只要細心些,很快就能掌握。嗯,下班回家去~

 

 轉載請注明出處:https://www.cnblogs.com/v88v/p/8886764.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM