項目:開發一個簡單的BBS論壇
需求:
整體參考“抽屜新熱榜” + “虎嗅網”
實作不同論壇版塊
文章清單展示
文章評論數、點贊數展示
線上使用者展示
允許登入使用者發貼、評論、點贊
允許上傳檔案
文章可被置頂
可進行多級評論
就先這些吧。。。
知識必備:
Django
HTML\CSS\JS
BootStrap
Jquery
1.設計表結構
在做項目之前隻要涉及到資料庫,就一定要把表結構想清楚,表結構沒有做出來,就不要動手寫代碼,這是做開發最起碼要堅持的一個原則。
表結構可以幫你理清思路,表結構是展現了你業務邏輯關系的。
fromdjango.db import modelsfromdjango.contrib.auth.models import Userfromdjango.core.exceptions import ValidationError
import datetime
# Create your models here.classArticle(models.Model):
# 文章标題可以重名,不同的使用者id就可以分别
title= models.CharField(max_length=255)
# 簡介可以為空
brief= models.CharField(null=True,blank=True,max_length=255)
# 所屬版塊 Category類位于Article下面時,調用需要加上引号
category= models.ForeignKey("Category")
content= models.TextField(u"文章内容")
author= models.ForeignKey("UserProfile")
# auto_now 和 auto_now_add 差別?
# 每次對象修改了,儲存都會更新auto_now的最新時間
# 每次對象建立的時候,會生成auto_now_add 時間
pub_date= models.DateTimeField(blank=True, null=True) # 為什麼不寫auto_now_add?
last_modify= models.DateTimeField(auto_now=True)
# 文章置頂功能
priority= models.IntegerField(u"優先級",default=1000)
head_img= models.ImageField(u"文章标題圖檔",upload_to="uploads")
status_choices= (('draft',u"草稿"),
('published',u"已釋出"),
('hidden',u"隐藏"),
)
status= models.CharField(choices=status_choices,default='published',max_length=32)
def __str__(self):returnself.title
def clean(self): # 自定義model驗證(除django提供的外required max_length 。。。),驗證model字段的值是否合法
# Don't allow draft entries to have a pub_date.
if self.status == 'draft' and self.pub_date isnot None:
raise ValidationError(('Draft entries may not have a publication date.'))
# Set the pub_datefor published items if it hasn't been set already.
if self.status == 'published' and self.pub_date isNone:
self.pub_date=datetime.date.today()classComment(models.Model):
article= models.ForeignKey(Article,verbose_name=u"所屬文章")
# 關聯到同一張表的時候需要關聯自己用self,當關聯自己以後 想反向查找需要通過related_name來查,
# 頂級評論不用包含父評論
parent_comment= models.ForeignKey('self',related_name='my_children',blank=True,null=True)
comment_choices= ((1,u'評論'),
(2,u"點贊"))
comment_type= models.IntegerField(choices=comment_choices,default=1)
user= models.ForeignKey("UserProfile")
comment= models.TextField(blank=True,null=True)# 問題來了? 點贊不用内容,但是評論要内容啊!!!
date= models.DateTimeField(auto_now_add=True)
# django clean方法可以實作表字段驗證
#Model.clean()[source]
#This method should be used to provide custom model validation, and to modify attributes on your modelifdesired.
# For instance, you could use it to automatically provide a valuefora field,
# or todovalidation that requires access to more than a single field:
def clean(self):if self.comment_type == 1 and len(self.comment) ==0:
raise ValidationError(u'評論内容不能為空,sb')
def __str__(self):return "C:%s" %(self.comment)classCategory(models.Model):
name= models.CharField(max_length=64,unique=True)
brief= models.CharField(null=True,blank=True,max_length=255)
# 一般頁面的版塊是固定死的,但是我們想動态生成版塊的時候,我們需要定義一個位置字段和是否顯示字段
# 一般正常的網站首頁都是固定的
set_as_top_menu= models.BooleanField(default=False)
position_index=models.SmallIntegerField()
# 可以有多個管理者
admins= models.ManyToManyField("UserProfile",blank=True)
def __str__(self):returnself.nameclassUserProfile(models.Model):"""在使用者表中定義一個friends 字段,關聯自己""" user =models.OneToOneField(User)
name=models.CharField(max_length=32)
signature= models.CharField(max_length=255,blank=True,null=True)
head_img= models.ImageField(height_field=150,width_field=150,blank=True,null=True)
#forweb qq
friends= models.ManyToManyField('self',related_name="my_friends",blank=True)
def __str__(self):return self.name
配置Django Admin
fromdjango.contrib import adminfrombbs import models
# Register your models here.classArticleAdmin(admin.ModelAdmin):
list_display= ('title','category','author','pub_date','last_modify','status','priority')classCommentAdmin(admin.ModelAdmin):
list_display= ('article','parent_comment','comment_type','comment','user','date')classCategoryAdmin(admin.ModelAdmin):
list_display= ('name','set_as_top_menu','position_index')
admin.site.register(models.Article,ArticleAdmin)
admin.site.register(models.Comment, CommentAdmin)
admin.site.register(models.UserProfile)
admin.site.register(models.Category,CategoryAdmin)
選擇合适的前端模闆
....
前端實作動态菜單
首頁菜單實作動态展示,首先将版塊取出來,排序(在資料庫中放兩個字段,一個是是否可以展示在前端首頁,另一個是它放置的位置),展示不同版塊的内容,目前版塊高亮顯示。有兩種實作方式:通過js擷取目前url對比;從資料庫傳回目前子產品
{% block top-menu %}{% for category in category_list %}
//1.循環後端傳回的版塊清單 2.後端需要傳回目前版塊 3.目前版塊id同循環版塊清單對比 4.給目前版塊加上active
{% if category.id == category_obj.id %}{{ category.name }}{% else %}{{ category.name }}{% endif %}
{% endfor %}{% endblock %}
html
category_list = models.Category.objects.filter(set_as_top_menu=True,).order_by('position_index')
def index(request):
category_obj= models.Category.objects.get(position_index=1) #首頁需要acitve cls,手動定義傳回
article_list= models.Article.objects.filter(status='published')return render(request, 'bbs/index.html', {'category_list': category_list,'article_list': article_list,'category_obj': category_obj,
})
def category(request, id):
#擷取闆塊對象
category_obj= models.Category.objects.get(position_index=id)if category_obj.id == 1: #判斷首頁
article_list= models.Article.objects.filter(status='published') #擷取已釋出的文章else:#擷取目前闆塊下已釋出的文章
article_list= models.Article.objects.filter(category_id=category_obj.id, status='published')return render(request, 'bbs/index.html', {'category_list': category_list,'article_list': article_list,'category_obj': category_obj,
})
Views
文章評論功能
當我們浏覽完文章,想評論的時候,提示登入,當登入成功後傳回到目前頁面,這個要怎麼實作呢?
{% if request.user.is_authenticated %} //驗證使用者是否登入
評論
{% else %}//登入成功 傳回的a标簽href=目前url後面加上?next跟目前路徑 在登入後才會傳回目前頁面!