Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)

仿CSDN博客网站结构,制作博客系统。实现文章展示、文章管理、文章在线编辑。


点击访问网站;主要功能已完成,一些细节还需完善

  • 网站前端使用jQuery+amaze ui完成

  • 后端使用Django+uwsgi+nginx完成

  • 底层使用MySQL+Redis+FastDFS+Celery完成

特别感谢amaze ui和editor.md的开源!


一、建立项目

1、使用虚拟环境

  • 虚拟环境安装参考博客:http://blog.csdn.net/pipisorry/article/details/47008981
# 新建虚拟环境
# -p后指定python命令所在路径(若使用系统已安装的环境建立虚拟环境可直接输入相应版本的命令,如python3.5)
# 最后指定一个虚拟环境名字,最好见名知意
 mkvirtualenv -p python3 django1.8.2-py3

# 启用虚拟环境
workon django1.8.2-py3

# 退出虚拟环境
deactivate

2、新建django项目

# 启用虚拟环境
workon django1.8.2-py3

# 安装django1.8.2
pip django==1.8.2

# 新建文件夹
mkdir ./django_blog

# 建立dj_blog项目在django_blog文件夹下
django-admin startproject dj_blog ./django_blog
  • django_blog目录结构如下:
    Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)_第1张图片

3、新建应用

# 确认是否处于虚拟环境下
# 进入项目目录
cd django_blog

# 新建apps文件夹及四个应用所在文件夹
mkdir ./apps
mkdir ./apps/blog_index ./apps/blog_article ./apps/blog_console ./apps/blog_sign

# 在apps文件夹中建立四个应用
python manage.py startapp blog_index ./apps/blog_index
python manage.py startapp blog_article ./apps/blog_article
python manage.py startapp blog_console ./apps/blog_console
python manage.py startapp blog_sign ./apps/blog_sign
  • 文件结构如图:
    Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)_第2张图片

4、配置项目的settings.py文件

  • 文件路径:dj_blog/settings.py
# settings.py中修改的内容

INSTALLED_APPS = (
    ...
    # 添加apps
    'apps.blog_index',
    'apps.blog_article',
    'apps.blog_console',
    'apps.blog_sign',
)
...
LANGUAGE_CODE = 'zh-hans'  # 使用中文
TIME_ZONE = 'Asia/Shanghai'  # 设定时区
  • 此时可以python manage.py runserver 查看一下是否可以运行
    Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)_第3张图片

二、设计模型

1、数据库设计

用户 用户详情 markdown文章 html文章 图片
ID 用户ID 用户ID 用户ID 用户ID
邮箱 昵称 标题 标题 标题
密码 QQ 内容 内容 内容
是否激活 微信 文章ID 文章ID 文章ID
微博 是否展示
GitHub 是否为头像
自我介绍

2、模型设计

1)新建抽象模型类,包含:创建时间、更新时间、删除标记
# 回到项目根目录
# 新建db_model文件夹
mkdir ./db_model
cd ./db_model

# 新建__init__.py文件和base_model.py
touch __init__.py base_model.py

Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)_第4张图片
- 编辑base_model.py文件

# base_model.py文件内容

from django.db import models


class BaseModel(models.Model):
    """
    定义抽象模型类
    """
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
    is_delete = models.BooleanField(default=False, verbose_name='删除标记')

    class Meta:
        abstract = True  # 是否为抽象模型类
2)编写模型及字段
  • 编写User(用户)、UserInfo(用户详情)模型类

  • User模型类继承Django提供的用户模型类AbstractUser

# apps/blog_sign/models.py内容

from django.db import models
from db_model.base_model import BaseModel
from django.contrib.auth.models import AbstractUser


# Create your models here.
# 使用Django提供的用户模型
class User(AbstractUser, BaseModel):
    def __str__(self):
        return self.username

    class Meta:
        db_table = 'blog_user'
        verbose_name = '用户列表'
        verbose_name_plural = verbose_name


class UserInfo(BaseModel):
    user = models.OneToOneField(User, verbose_name='用户名', on_delete=models.CASCADE)
    qq_id = models.CharField(max_length=15, null=True, blank=True, verbose_name='QQ账号')
    wechat_id = models.CharField(max_length=50, null=True, blank=True, verbose_name='微信账号')
    github_id = models.CharField(max_length=50, null=True, blank=True, verbose_name='GitHub账号')
    weibo_id = models.CharField(max_length=50, null=True, blank=True, verbose_name='微博账号')
    introduction = models.CharField(max_length=250, null=True, blank=True, verbose_name='个人简介')
    name = models.CharField(max_length=30, null=True, blank=True, verbose_name='昵称')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'blog_userinfo'
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name
  • 将User模型注册到settings.py中
# dj_blog/settings.py添加配置

# 自定义User模型类设置
# 继承重写User模型类时,指定自定义的模型类,'app名字.类名'
AUTH_USER_MODEL = 'blog_sign.User'
  • 编写BlogMarkdown(markdown文章)、BlogHtml(html文章)、BlogImage(图片)模型类
# apps/blog_console/models.py内容

from django.db import models
from db_model.base_model import BaseModel
from apps.blog_sign.models import User


# Create your models here.

class BlogMarkdown(BaseModel):
    user = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
    title = models.CharField(max_length=30, verbose_name='标题')
    article = models.TextField(verbose_name='文章')

    def __str__(self):
        s = self.title
        return s

    class Meta:
        db_table = 'blog_markdown'
        verbose_name = 'Markdown列表'
        verbose_name_plural = verbose_name


class BlogHtml(BaseModel):
    user = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
    title = models.CharField(max_length=30, verbose_name='标题')
    article = models.TextField(verbose_name='文章')
    markdown = models.OneToOneField(BlogMarkdown, verbose_name='markdown文章ID', on_delete=models.CASCADE)
    is_show = models.BooleanField(default=True, verbose_name='是否发布')

    def __str__(self):
        s = '【' + str(self.user_id) + '】' + self.title
        return s

    class Meta:
        db_table = 'blog_html'
        verbose_name = 'Html列表'
        verbose_name_plural = verbose_name


class BlogImage(BaseModel):
    user = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
    article = models.ForeignKey(BlogMarkdown, null=True, blank=True, verbose_name='所属文章', on_delete=models.CASCADE)
    title = models.CharField(max_length=30, null=True, blank=True, verbose_name='标题')
    image = models.ImageField(upload_to='image', verbose_name='图片')
    is_head = models.BooleanField(default=False, verbose_name='是否为头像')
    is_show = models.BooleanField(default=False, verbose_name='是否展示')

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'blog_image'
        verbose_name = '图片列表'
        verbose_name_plural = verbose_name
3)生成迁移文件,并写入数据库
  • 目前使用的数据库是Django默认的sqlite数据库,项目目录中的db.sqlite3就是数据库文件

  • 项目新建阶段暂时使用sqlite数据库,后期会改为mysql数据库

# 终端进入项目根目录
# 确认处于虚拟环境
# 生成迁移文件
python manage.py makemigrations

# 根据迁移文件修改数据库
python manage.py migrate
  • 生成过程如图:
    Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)_第5张图片

项目建立和模型设计完成

相关代码下载

https://download.csdn.net/download/u010139869/10392306

你可能感兴趣的:(django)