Django2.0:【Django2.0教程】05.定制后台和修改模型 视频学习笔记

视频链接: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”:

而真删除的实际操作如下:

猜你喜欢

转载自blog.csdn.net/zhangk9509/article/details/80288840
今日推荐