django定义模型(4)

编写模型Model

定义班级类,在MyApp目录下的models.py中插入如下代码定义班级类,在MyApp目录下的models.py中插入如下代码

  • 模型类都继承自models.Model
  • DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add
DateTimeField.auto_now

这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的。

DateTimeField.auto_now_add

这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

  • BooleanField和NullBooleanField
BooleanField:可选项只有01~255两种```
NullBooleanField:可选项为null和yes,还有no三项

# 班级类
class Grade(models.Model):

# 班级名称
gname = models.CharField(max_length=10)

# 开班日期
gdate = models.DateTimeField()


# 女生数量
ggirlnum = models.IntegerField()

# 男生数量
gboynum = models.IntegerField()

# 是否已逻辑删除该班级
isDelete = models.BooleanField(default=False)

# 定义班级的打印输出信息
def __str__(self):
    return self.gname
在加入一个模型student类

# 学生类
class Students(models.Model):
# 学生姓名
sname = models.CharField(max_length=20)

# 学生性别
sgender = models.BooleanField(default=True)

# 学生年龄
sage = models.IntegerField()

# 备注信息
sinfo = models.CharField(max_length=20)

# 是否已逻辑删除该学生
isDelete = models.BooleanField(default=False)

# 学生所属的班级
sgrade = models.ForeignKey(Grade)

数据迁移

  • 每次修改模型后都要进行数据迁移
    指令
 #生成迁移文件(在MyApp下的migrations包中,迁移不成功可以删除掉里面的文件)
python manage.py makemigrations
 #执行数据迁移
python mananger.py migrate
  • 迁移过后,框架为我们自动生成了库表,Django默认自带的数据库是SQLite数据库;
  • 数据库文件生成路径为工程根目录下的db.sqlite3;
    建立数据库选的是Sqlite(Xerial)

完成模型的建立

  • 下面是模型的操作(在pychrm里面)

django定义模型(4)_第1张图片
这里进行曾删改查

  • 模型的操作(在网页)
#先创建一个管理员身份
python manage.py createsuperuser

过程中要求输入账号和邮箱还有密码
完成后可以进入页面http://127.0.0.1:8000/admin验证账号密码后进行简陋管理
@配置语言和时区

设置为中文,设置时区为上海,即settings中:

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE='Asia/Shanghai'

添加自己的数据模型,在admin.py中注册

#Student,Grade是之前所建模型的class名,还要导入所在库
from app.models import Grade, Students

admin.site.register(Grade)
admin.site.register(Students)

导入后可以在后台管理
django定义模型(4)_第2张图片
不加这个的话值默认显示下面,里面只能添加名字
@个性化站点管理

  • 效果是在查看Grades时显示更丰富

也是在admin.py中修改
创建数据管理类
class GradeAdmin(admin.ModelAdmin):

#要显示的字段
list_display = ('gname','gdate','ggirlnum')

#过滤字段 
list_filter = ('gdate',) 

#分页,每页显示多少条数据 
list_per_page = 3 

#搜索字段
search_fields = ('gname',)

添加完之后下面的注册也要修改不然没效果

admin.site.register(Grade,GradeAdmin)

@布尔值定制显示

也是在admin.py中修改
效果:布尔类型的性别默认显示为True和False,我们通过几步简单配置使之显示为男女;
定义sgender字段的显示函数
class StudentAdmin(admin.ModelAdmin):

#定义sgender字段的显示函数
def getGender(self):
    if self.sgender == True:
        return '男'
    else:
        return '女'

#设置显示的标题
getGender.short_description = '性别'

#设置显示字段
list_display = ('sname',getGender,'sage','sinfo','sgrade')

@一方查看和添加多方数据
效果:就是在添加班级时,最下面出现2行默认的学生,方便快捷添加
此处以在班级中查看和添加学生为例;
创建班级的Admin
class GradeAdmin(admin.ModelAdmin):
inlines = [StudentInfo]
1
2
创建学生信息
class StudentInfo(admin.TabularInline):
model = Student
extra = 2
@使用模型数据在页面输出
先修改views.py下的方法添加

# 查询所有学生
students =Students.objects.all()
    # 构造数据字典
    datadict={
        #stu和页面内的stu相连可以随意取
        'stu':students
    }
    # 将数据丢给templates/welcome.html进行渲染并呈现给用户
    return render(request,'where.html',context=datadict)

页面内的使用

 <ul>
     #stu就是上面取得
    {% for s in stu %}
        <li>{{ s.sname }}li>
    {% endfor %}
    ul>

@配置语言和时区

设置为中文,设置时区为上海,即settings中:

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE='Asia/Shanghai'

@定制站点信息

在admin中继承AdminSite
class MyAdminSite(admin.AdminSite):

#浏览窗口显示的页面名称
site_title = '我的地盘'

#管理网页的页头部的标题
site_header = '学生管理系统'

#查看站点时跳转主页路由,默认/
site_url = '/welcome'

效果:
django定义模型(4)_第3张图片
@自定义站点页面模板

默认的系统模板位置:django/contrib/admin/templates/admin
将需要重新定制的文件复制出来,此处假设修改登录页面login.html
在自己的模板目录下创建相对应的子目录,即:/templates/admin/
修改拷贝的login.html

你可能感兴趣的:(django)