模块划分
使用typora画图,语言选择mermaid。
classDiagram
Animal <|-- Duck
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
Animal: +Post
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
Post <|-- Animal
Link <|-- Animal
classDiagram
class Post{
-int ID
-string title
-string description
-string content
-int status
-datetime created_time
+Category category
+Tag tags
+Comment comments
+User owner
}
class Category{
-int ID
}
class Tag{
-int ID
}
class Link{
-int ID
}
class Comment{
+int ID
}
class SideBar{
-int ID
}
class User{
-int ID
}
User:+int age
User:+Read()
Post <|-- User
Post <|-- Category
Post <|-- Tag
Post <|-- Comment
SideBar <|-- User
Link <|-- User
Category <|-- User
Tag <|-- User
创建App
python manage.py startapp blog创建blog,之前已经创建,跳过该步
python manage.py startapp blog_config创建blog_config
python manage.py startapp comments创建comments
代码编写
bolg
更改models.py
from config.settings import STATIC_URL
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Category(models.Model):
STATUS_ITEMS = ((0, "正常"), (1,"删除"))
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) -> str:
return self.name
class Meta:
verbose_name = verbose_name_plural = "分类"
class Tag(models.Model):
STATUS_ITEMS = ((0, "正常"), (1,"删除"))
name = models.CharField(max_length=50)
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="创建时间")
def __str__(self) -> str:
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) -> str:
return self.name
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)
blog_config
更改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
comments
更改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
其他设置
同步更改
python manage.py makemigrations
python manage.py migrate
重载supervisor
sudo supervisorctl reload
访问后台

本文介绍了如何使用Django从零开始构建个人博客网站,包括模块划分、创建App如blog、blog_config和comments,以及各模块的代码编写,如更改models.py和admin.py。此外,还涉及了其他设置,如同步数据库更改、重载supervisor配置,并指导如何访问后台管理系统。

被折叠的 条评论
为什么被折叠?



