视频链接:05.定制后台和修改模型
定制admin后台
修改article/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
打开 http://127.0.0.1:8000/admin ,登录,进入Articles。
修改article/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",) # 按id正序
# ordering = ("-id",) # 倒序
admin.site.register(Article, ArticleAdmin)
也可以通过装饰器实现同样的效果;
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",)
修改模型
修改模型即修改article/models.py,修改之后需要更新数据库:$ python manage.py makemigrations
$ python manage.py migrate
修改article/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
更新数据库会打印一下信息:
You are trying to add a non-nullable field 'created_time' to article without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
因为库中已经存有信息,新增字段需要有默认值。按照提示,此处有两种选择,先做第一种,在此处设置默认值(先备份一下db.sqlite3)。输入一个默认值,这里输入“1”。之后又有信息:
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> timezone.now
根据提示输入timezone.now,获取当前时间(与北京时间相差8小时),也可以输入其他值。 修改article/admin.py,并更新数据库。
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", "created_time")
ordering = ("id",)
下面是第二种选择,还原db.sqlite3,并删除aritcle/migrations/0002_article_created_time.py
修改article/models.py:
from django.db import models
from django.utils import timezone
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
created_time = models.DateTimeField(default=timezone.now)
def __str__(self):
return "<Article: %s>" % self.title
更新数据库,效果同第一种方法。 或者修改为:
from django.db import models
from django.utils import timezone
# 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) # 创建时自动添加现在时间
def __str__(self):
return "<Article: %s>" % self.title
继续修改:
from django.db import models
from django.utils import timezone
# 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) # 自动以现在时间赋值
def __str__(self):
return "<Article: %s>" % self.title
并修改article/admin.py:
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", "created_time", "last_updated_time")
ordering = ("id",)
添加用户字段,可以自己创建一个用户模型,也可以使用Django自带的用户模型。修改article/models.py:
from django.db import models
# 用Django自带的用户模型
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)
auther = models.ForeignKey(User, on_delete=models.DO_NOTHING, default=1)
# ondelete表示文章被删除之后,是否级联删除外键auther
# default为默认值
def __str__(self):
return "<Article: %s>" % self.title
修改“auther”为“author”,更新数据库,打印出如下信息:
Did you rename article.auther to article.author (a ForeignKey)? [y/N] y
询问是否是同一个外键。 修改article/models.py:
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) # 标记是否被删除。删除文章时实际上是修改此字段,实现“假”删除,防止误删等操作
read_num = models.IntegerField(default=0) # 阅读数量
def __str__(self):
return "<Article: %s>" % self.title
article/admin.py:
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", "is_deleted", "author", "created_time", "last_updated_time")
ordering = ("id",)
article/views.py:
from django.shortcuts import render_to_response, get_object_or_404
from .models import Article
# Create your views here.
def article_detail(request, article_id):
article = get_object_or_404(Article, pk=article_id)
context = {}
context['article_obj'] = article
return render_to_response("article_detail.html", context)
def article_list(request):
articles = Article.objects.filter(is_deleted=False) # 过滤
context = {}
context['articles'] = articles
return render_to_response("article_list.html", context)
更新数据库。
进入某篇文章可以修改“is_deleted”:
而真删除的实际操作如下: