这节课的主要内容是针对models.py
进行修改。另,网上有篇文章讲的不错,建议看看。Django ORM模块精讲
下面进入本节课内容总结。
1. 注册应用的新方法
这部分是针对的是admin.py
。原版本的admin.py
如下:
from django.contrib import admin
from .models import Article
# Register your models here.
admin.site.register(Article)
在Django 2.0以后支持使用函数包装器来注册,于是我们可以修改代码如下:
from django.contrib import admin
from .models import Article
# Register your models here.
@admin.register(Article) # 与admin.site.register(Article)同义。
2. 让admin界面按字段显示
如图:
效果图
可以在admin.py
处定义一个类class ArticleAdmin(admin.ModelAdmin)
。然后定义其中的属性。代码如下:
class ArticleAdmin(admin.ModelAdmin):
list_display = ["id", "title", "content", "create_time", "last_updated_time", "author", "is_deleted", "read_num"]
# list_display:按什么显示就写什么,必须是在models.py中出现的
ordering = ["id"] # 按什么排序
3. 那么models.py应做什么修改
原版代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from django.db import models
# Create your models here.
class Article(models.Model): # 从models中找字段类型
title = models.CharField(max_length = 30)
content = models.TextField()
修改后的代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from django.db import models
#from django.utils.timezone import now
from django.contrib.auth.models import User
# Create your models here.
class Article(models.Model): # 从models中找字段类型
title = models.CharField(max_length = 30)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add = True)
last_updated_time = models.DateTimeField(auto_now = True)
author = models.ForeignKey(User, on_delete = models.DO_NOTHING,default = 1)
is_deleted = models.BooleanField(default = False)
read_num = models.IntegerField(default = 0)
def __str__(self):
return "<Article : {}>".format(self.title)
仔细阅读两版代码,可以发现相比于原版代码,改后的代码添加了很多字段,还添加了一个魔法方法__str__
。
首先说这个魔法方法。在未对admin.py
修改时,文章列表可以显示为<Article : 123>
的样子。
然后再看Article类中定义的字段。
-
create_time = models.DateTimeField(auto_now_add = True)
: 采用了DateTimeField
字段,参数中指定了auto_now_add = True
,表明意思是自动添加当前时间 -
last_updated_time
:参数中指定了auto_now = True
,与auto_now_add
不同的是auto_now会一直更新,auto_now_add以上次编辑时间为准 -
author
:指定的是models.ForeignKey(User)
,表示创作者 -
is_deleted
:指定BooleanField()
-
read_num
:指定IntegerField()
网友评论