Datawhale组队学习(Django网站开发)task03:从零开始搭建个人博客网站

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

模块划分

使用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
Animal +int age +String gender +Post +isMammal() +mate() Duck +String beakColor +swim() +quack() Fish -int sizeInFeet -canEat() Zebra +bool is_wild +run() Post Link
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
Post -int ID -string title -string description -string content -int status -datetime created_time +Category category +Tag tags +Comment comments +User owner Category -int ID Tag -int ID Link -int ID Comment +int ID SideBar -int ID User -int ID +int age +Read()

创建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

访问后台

在这里插入图片描述

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D_ry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值