Django搭建个人博客系列: Models和Admin编写

1. 创建blog_config和comment app

在上一个项目的基础上,创建blog_config APP、comment APP

python manage.py startapp blog_config
python manage.py startapp comments

把要新建的app添加到settings.py中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'blog_config',
    'comment',
]

 2. 编写blog APP的内容

修改models.py

from django.db import models
from django.contrib.auth.models import User


class Blog(models.Model):
    title = models.CharField(max_length=50, verbose_name="标题")
    content = models.TextField(verbose_name="文章内容", default="")
    count = models.IntegerField(verbose_name="阅读次数", default=0)
    create_time = models.DateTimeField(auto_now=True, verbose_name="创建时间")

    class Meta:
        verbose_name = '博客管理'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title


class Category(models.Model):
    """分类"""

    STATUS_ITEMS = (
        (1, "正常"),
        (0, "删除"),
    )
    name = models.CharField(max_length=50, verbose_name="名称")
    status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    is_nav = models.BooleanField(default=False, verbose_name="是否为导航")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = verbose_name_plural = '分类'


class Tag(models.Model):
    """标签"""
    STATUS_ITEMS = (
        (1, "正常"),
        (0, "删除"),
    )
    name = models.CharField(max_length=50)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = verbose_name_plural = '标签'


class Post(models.Model):
    """文章"""
    STATUS_ITEMS = (
        (0, "删除"),
        (1, "正常"),
        (2, "草稿")

    )
    title = models.CharField(max_length=255, verbose_name="标题")
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    category = models.ForeignKey(Category, verbose_name="分类", on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag, verbose_name="标签")
    desc = models.CharField(max_length=1024, verbose_name="摘要")
    content = models.TextField(verbose_name="正文")
    status = models.IntegerField(choices=STATUS_ITEMS, default=2, verbose_name="状态")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = verbose_name_plural = '文章'

修改admin.py

from django.contrib import admin

from .models import Category, Tag, Post
# Register your models here.

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'status', 'owner', 'is_nav', 'post_count','created_time')
    fields = ('name', 'status',  'is_nav')


    # select * from Post p where p.category = 'Demo'
    def post_count(self, obj):
        return f"{obj.post_set.count()}篇文章"

    post_count.short_description = "文章数"

    def save_model(self, request, obj, form, change):
        obj.owner = request.user
        print(request.user)
        return super(CategoryAdmin, self).save_model(request, obj, form, change)

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    pass

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('category','title', 'owner', 'status')
    exclude =('owner',)

    actions_on_top = True # 首页的按钮
    actions_on_bottom = True # 首页的按钮

    save_on_top = True # 编辑页面的按钮
    search_fields = ('title','category__name')


    def save_model(self, request, obj, form, change):
        obj.owner = request.user
        print(request.user)
        return super(PostAdmin, self).save_model(request, obj, form, change)

3. 编写blog_config APP的内容

修改models.py

from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class Link(models.Model):
    """友情链接"""
    STATUS_ITEMS = (
        (1, "正常"),
        (0, "删除"),
    )
    title = models.CharField(max_length=50, verbose_name="网站名称")
    href = models.URLField(verbose_name="链接")
    status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    weight = models.IntegerField(choices=zip(range(1, 11), range(1, 11)), default=1, verbose_name="权重")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = verbose_name_plural = '友情链接'


class SideBar(models.Model):
    """侧边栏"""
    TYPE_ITEMS = (
        (1, "HTML"),
        (2, "最新文章"),
        (3, "最热文章"),
        (4, "最近评论"),
    )
    STATUS_ITEMS = (
        (1, "展示"),
        (0, "隐藏"),
    )
    title = models.CharField(max_length=50, verbose_name="标题")
    display_type = models.IntegerField(choices=TYPE_ITEMS, default=1, verbose_name="展示类型")
    status = models.IntegerField(choices=STATUS_ITEMS, default=1, verbose_name="状态")
    content = models.CharField(max_length=500, verbose_name="内容")
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = verbose_name_plural = '侧边栏'

 修改admin.py

from django.contrib import admin
from .models import Link, SideBar


# Register your models here.
@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    pass


@admin.register(SideBar)
class SideBarAdmin(admin.ModelAdmin):
    pass

4. 编写comment APP的内容

修改models.py

from django.db import models
from blog.models import Post
# Create your models here.

class Comment(models.Model):
    """评论"""
    target = models.ForeignKey(Post, verbose_name="评论目标", on_delete=models.CASCADE)
    nickname = models.CharField(max_length=50, verbose_name="昵称")
    email = models.EmailField(verbose_name="邮箱")
    website = models.URLField(verbose_name="网站地址")
    content = models.TextField(verbose_name="评论内容")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return f"{self.target} By {self.nickname}"

    class Meta:
        verbose_name = verbose_name_plural ='评论'

修改admin.py

from django.contrib import admin
from .models import Comment

# Register your models here.

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    pass

 5. 同步数据库

python manage.py makemigrations

python manage.py migrate

 6. 运行项目,界面展示

python manage.py runserver 127.0.0.1:8899

 

posted @ 2021-07-04 15:06  呆叔编程567  阅读(113)  评论(0编辑  收藏  举报