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