1.项目需求分析mysql
1.登录功能(基于ajax,图片验证码)ajax
2.注册功能(基于ajax,基于forms验证)sql
3.博客首页数据库
4.我的站点django
5.文章详情app
6.点赞,点踩url
7.评论spa
--根评论code
--子评论orm
8.后台管理
--文章展现
--新增文章
9.发布文章
二.项目表格建立
1.须要建立的表格
用户信息表 ------UserInfo
我的站点表-------Blog
分类表 -------Category
标签表 --------Tag
文章表 --------Article
文章和标签之间的第三张表,也可本身建立 ------Article2Tag
点赞点踩表 ---ArticleUpDown
文章评论表 ----Comment
2.表格之间的关联关系
UserInfo 一对一 Blog
Blog 一对多 Category
Blog 一对多 Tag
Article 一对多 UserInfo
一对多 Category
多对多 Tag
Article2Tag 一对多 Article
一对多 Tag
ArticleUpDown 一对多 UserInfo
一对多 Article
Comment 一对多 UserInfo
一对多 Article
自关联 ForeignKey对象是本身
3.表格应有的字段
UserInfo nid telephone avatar create_date blog 其余的继承的AbstractUser自动帮忙建立
Blog nid title site_name theme
Category nid blog title
Tag nid title blog
Article nid title desc content create_date comment_num up_num down_num user category tag
Article2Tag nid article tag
ArticleUpDown nid article user is_up
Comment nid article user comm create_date parent_comment
4.建表一些须要注意的点:-------这里只列出须要注意的点,缘由在文件里都有备注。
4.1 UserInfo表须要继承AbstractUser,为了应用auth。
4.2 建立avatar字段调用FileField类,里面传入参数upload_to和default的意义。
4.3 建立crete_date须要调用DateTimeField,里面须要传入auto_now_add的意义
4.4 2.0版本级联删除的问题 on_delete = models.CASCADE
4.5 CharField参数verbose_name的意思。
4.6 外键to加引号和不加引号的区别
4.7 建立文本内容字段须要用TextField
4.8 两个表之间是多对多关系,第三张表能够自定义由于有时会有在第三张表添加新字段的需求。
若是自定义第三张表须要在其中一个表参数里指定through和through_fields。
最全BBS表格建立及涉及到的配置
settings里涉及到建立表和初始数据库的配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'NAME': 'bbs2', 'USER': 'root', 'PASSWORD': '123' }
# 这儿必定要写 ,找了半天才发现!!!必须在建立表以前写上,否则会报错。 # 并且表格建立完成后再加上,makemigrations是不支持的 AUTH_USER_MODEL='bbs.UserInfo' # 根路由,只有在模板里能用到 和media_url用法类似 开的url只是为了让django识别 名字能够随意命名 # static_url映射static_root STATIC_URL = '/static/' # 建立多个app咱们可能须要在不一样app下建立static文件,若是几个app下须要用到同一个静态文件,就会出现浪费加载时间 # 因此为了方便管理和提升加载效率,咱们把一些经常使用的静态文件放在一个根路径下。STATICFILES_DIRS指定额外的静态文件 # 存储位置 # 别人不能直接访问静态文件 若是别人直接输入你的静态文件地址是不能访问的 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]
models建立表
1 from django.db import models 2 from django.contrib.auth.models import AbstractUser 3 4 5 # 自动建立的id,不知道能不能用to_field指定 6 # 只要BBS上有的数据你都要存放到表里,对应到不一样的表,作好关联。 7 # Create your models here. 8 # 这里要继承AbstractUser,应用auth模块。 9 # id不须要手动去建立,orm会自动帮你建立 10 class UserInfo(AbstractUser): 11 id = models.AutoField(primary_key=True) 12 # 这些建立表的类都是models里面封装好的,直接models.类名调用 13 telephone = models.CharField(max_length=32) 14 # FileField里面参数:verbose_name=None, name=None, upload_to='', storage=None, **kwargs 15 # verbose_name的意思很简单,就是给你的模型类起一个更可读的名字,通常定义为中文 16 # 文件流是不会放到数据库里面的,该字段在数据库中只存储路径,django提供了upload_to属性 , 17 # upload_to设定上传文件的存储目录和名称。初始默认路径下的设定图片 18 avatar = models.FileField(upload_to='avatar/', default='avatar/default.png') 19 # auto_now和auto_now_add。二者默认值都为False。auto_now = True 实例化字段会自动保存当前时间,没法手动添加非当前时间 20 # auto_now_add 能够手动添加非当前时间 21 create_date = models.DateTimeField(auto_now_add=True) 22 blog = models.OneToOneField(to='Blog', to_field='id', null=True) 23 24 25 # 其余的都要继承django预设的类models.Model 26 class Blog(models.Model): 27 id = models.AutoField(primary_key=True) 28 title = models.CharField(max_length=32, verbose_name='博客标题') 29 # 站点名称 30 site_name = models.CharField(max_length=32, verbose_name='站点名称') 31 # 博客主题样式 32 theme = models.CharField(max_length=32, verbose_name='博客主题样式') 33 34 def __str__(self): 35 return self.title 36 37 38 class Category(models.Model): 39 id = models.AutoField(primary_key=True) 40 title = models.CharField(max_length=32) 41 # 软关联两张表,至关于只设置了逻辑上的关联db_constraint=False 42 # db_constraint = False没有外键约束,有外键约束,是为了避免写脏数据 43 blog = models.ForeignKey(to='Blog', to_field='id', null=True) 44 45 def str(self): 46 return self.title 47 48 49 class Tag(models.Model): 50 id = models.AutoField(primary_key=True) 51 # 标签名称 52 title = models.CharField(max_length=32) 53 # 所属博客 54 blog = models.ForeignKey(to="Blog", to_field='id', null=True) 55 56 def __str__(self): 57 return self.title 58 59 60 class Article(models.Model): 61 id = models.AutoField(primary_key=True) 62 # 文章标题 63 title = models.CharField(max_length=32) 64 # 文章摘要 65 desc = models.CharField(max_length=255) 66 # 存大文本 文章内容 67 content = models.TextField() 68 create_date = models.DateTimeField(auto_now_add=True) 69 # 默认为0 70 comment_num = models.IntegerField(default=0) 71 up_num = models.IntegerField(default=0) 72 down_num = models.IntegerField(default=0) 73 user = models.ForeignKey(to='UserInfo', to_field='id', null=True) 74 category = models.ForeignKey(to='Category', to_field='id', null=True) 75 # 手动建立多对多的第三张表 为了方便添加一些字段 76 # 经过through指定本身写的中间表 77 tag = models.ManyToManyField(to='Tag', through='Article2Tag', through_fields=('article', 'tag')) 78 79 80 # 本身建立中间表,add(),remove(),set()不能用了 81 class Article2Tag(models.Model): 82 id = models.AutoField(primary_key=True) 83 # 文章id 外键关联 自动帮忙在字段后面加上id 84 article = models.ForeignKey(to='Article', to_field='id', null=True) 85 # 标签id 86 tag = models.ForeignKey(to='Tag', to_field='id', null=True) 87 88 89 class ArticleUpDown(models.Model): 90 id = models.AutoField(primary_key=True) 91 # 用户不能为空 92 user = models.ForeignKey(to='UserInfo', to_field='id') 93 # 点赞/点踩 的文章 94 article = models.ForeignKey(to='Article', to_field='id', null=True) 95 # 赞仍是踩 96 is_up = models.BooleanField(default=True) 97 98 99 class Comment(models.Model): 100 id = models.AutoField(primary_key=True) 101 # 评论的用户 102 user = models.ForeignKey(to='UserInfo', to_field='id') 103 # 评论的文章 104 article = models.ForeignKey(to='Article', to_field='id') 105 # 评论的内容 106 comm = models.CharField(max_length=255) 107 # 评论的时间 108 create_date = models.DateTimeField(auto_now_add=True) 109 # 两种写法 to = 'self' 110 # parent_comment=models.ForeignKey(to='Comment',to_field='nid') 111 # 父评论的id,自关联,防止写脏数据 112 parent_comment = models.ForeignKey(to='self', to_field='id', null=True)