天天看點

python bbs論壇_python 學習筆記二十 django項目bbs論壇

項目:開發一個簡單的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對比;從資料庫傳回目前子產品

python bbs論壇_python 學習筆記二十 django項目bbs論壇
python bbs論壇_python 學習筆記二十 django項目bbs論壇

{% 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

python bbs論壇_python 學習筆記二十 django項目bbs論壇
python bbs論壇_python 學習筆記二十 django項目bbs論壇

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跟目前路徑 在登入後才會傳回目前頁面!