1.定制admin后台
按照之前的默认界面,登录后是下面的界面:
下面就开始定制后台界面。
1-1.设置模型__str__
注意: str左右是两个_线
首先在创建的app文件夹下的models.py中添加内容:
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
def __str__(self):
return '<Article: %s>' %(self.title)
保存后,进入后台界面:
1-2.定制admin
由于后面会涉及模型与模型的引用,所以用__str__来显示文章内容并不合适。我们需要在admin.py来进行修改。
from django.contrib import admin
from .models import Article
# Register your models here.
class ArticleAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'content')
ordering = ('id',)
admin.site.register(Article, ArticleAdmin)
注:list_display和ordering是已经内置的,可以用元组也可用列表,这里使用元组形式,因为内容为不可变。list_display是设置显示的内容,ordering是设置排序,不添加默认倒序或者在排序规则id前添加-号。
上面代码也可以通过修饰器来实现:
from django.contrib import admin
from .models import Article
# Register your models here.
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'content')
ordering = ('id',)
2.修改模型
修改模型需要更新数据库才可以。
修改之前最好备份一下数据库文件,防止操作失误等问题。如图:
编辑models.py文件:
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
created_time = models.DateTimeField()
def __str__(self):
return '<Article: %s>' % (self.title)
这里修改完成后需要更新数据库,如果不进行更新,打开就会报错。
更新数据库的命令为:
python manage.py makemigrations
python manage.py migrate
这时如果直接执行第一条命令,由于models.py中没有设置默认值,在执行后会出现一下情况:
1为输入一个有效值为默认值;
2为取消本次操作在models.py中添加默认值
现在演示用1的方式,输入1然后回车,在命令行中输入
timezone.now
这样就设置了时间的默认值,但是这个命令时根据美国的时间来计算的,所以与当前时间会相差8小时。
如果要提前设置默认值时,在models.py中添加:
from django.utils import timezone
created_time = models.DateTimeField(default=timezone.now)
然后再执行数据库更新的两个语句。
另外,在models.py中
created_time = models.DateTimeField()
括号里可以添加
auto_now_add=True
可以实现创建文章后自动添加当前时间。
添加后同样要更新数据库。
添加最后修改时间字段,同创建字段一样。加入语句:
last_updated_time = models.DateTimeField(auto_now=True)
这样就实现了最后修改时,自动更新改字段的时间。
记得在admin.py中修改list_display将created_time和last_updated_time添加进去
添加作者author和是否删除字段,这里与前面不同的地方在于,django里内置了关于作者的相关设置直接导包即可:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
created_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)
def __str__(self):
return '<Article: %s>' % (self.title)
在使用is_deleted字段时,如果标记了已删除,同时要求界面中只显示未删除的文章,在views.py中修改语句:
articles = Article.objects.all()
改为:
articles = Article.objects.filter(is_deleted=False)
这样标记已删除的文章就不会显示。