上一篇咱們已經建立好了一個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就是一對一關係了,執行數據庫同步命令。
如今在頁面上的班級信息裏選擇班主任,一個班主任在被一個班級選定以後,其餘班級是沒法再選擇的: