一、創建模型
模型是表示我們的數據庫表或集合類,并且其中所述類的每個屬性是表或集合的字段,在 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就是一對一關系了,執行數據庫同步命令。
現在在頁面上的班級信息里選擇班主任,一個班主任在被一個班級選定之后,其他班級是無法再選擇的:
?
具體源碼內容? 請關注學長公眾號回復“Django”
?
公眾號二維碼? ? ? ? ? ? ? ? ?