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

上一篇咱們已經建立好了一個Xadmin的基礎項目,如今咱們將在此基礎上構建一個一樣很基礎的學生信息管理系統。python

 

1、建立模型數據庫

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

 

一、首先,導入models模塊app

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)

 

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

python3 manage.py makemigrations
python3 manage.py migrate

如今看看數據庫,已經有了這張咱們已經建立好的表及相關字段:blog

 

 

二、建立好數據表以後,接下來要將數據模型展現到頁面rem

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

import xadmin
from .models import *

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

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

最後,對其進行註冊:

xadmin.site.register(Students, StudentsAdmin)

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

 

 

三、本地化語言顯示

是否發現左側欄目顯示的仍是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

 

 四、下拉選項

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

在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就是一對一關係了,執行數據庫同步命令。

如今在頁面上的班級信息裏選擇班主任,一個班主任在被一個班級選定以後,其餘班級是沒法再選擇的:

相關文章
相關標籤/搜索