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)