Django小项目简单BBS论坛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django小项目简单BBS论坛相关的知识,希望对你有一定的参考价值。

开发一个简单的BBS论坛

项目需求:

技术分享
1 整体参考“抽屉新热榜” + “虎嗅网”
2 实现不同论坛版块
3 帖子列表展示
4 帖子评论数、点赞数展示
5 在线用户展示
6 允许登录用户发贴、评论、点赞
7 允许上传文件
8 帖子可被置顶
9 可进行多级评论
技术分享

知识必备:(注:没有必备下面知识的同学,请返回去看会之后再看下面的内容防止蒙了~~!

1 Django
2 html\\CSS\\JS
3 BootStrap
4 Jquery

设计表结构

1、表结构重要性

在开发任何项目的时候,设计到数据库,第一个事情要做的是设计表结构。表结构设计不好就不要写代码,表结构是体现了你业务逻辑关系的。你的数据都要往数据库里存,其实表结构你要理清了你的架构也就出来了!

2、设计表

 

技术分享
#!/usr/bin/env python
#-*- coding:utf-8 -*-from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User

# Create your models here.class Article(models.Model):
    ‘‘‘
    帖子表
    ‘‘‘#标题最大长度255,不能重名
    title = models.CharField(u文章标题,max_length=255,unique=True)
    #发布办款-使用外键关联Category
    category = models.ForeignKey("Category",verbose_name=板块名称)
    ‘‘‘
    这里在admin中,title默认是显示英文的,我们可以在他的最前面加要给字段,在admin中就可以显示中文,他和verbose_name一样,什么时候必须使用
    verbose_name呢?比如上面的{category = models.ForeignKey("Category",verbose_name=‘板块名称‘)} 这个字段第一个字段是关联的类,这里
    就必须使用verbose_name
    ‘‘‘#上传文件
    head_img = models.ImageField(upload_to="uploads")
    #文章内容(文章内容可能有很多,所以我们就不用"CharField"来写了,我们用TextField,不用规定他多长了,为可扩展长度)
    content = models.TextField(u"内容")
    #文章作者
    author = models.ForeignKey("UserProfile",verbose_name="作者")
    #发布日期
    publish_date = models.DateTimeField(auto_now=True,verbose_name="发布日期")
    #是否隐藏
    hidden = models.BooleanField(default=False,verbose_name="是否隐藏")
    #帖子的优先级
    priority = models.IntegerField(default=1000,verbose_name="优先级")

    def __unicode__(self):
        return "<%s,author:%s>" % (self.title,self.author)

class Comment(models.Model):
    ‘‘‘
    评论表
    ‘‘‘#评论是基于文章的,并且一条评论只属于一个文章!对多的关系#一个文章可以有多个评论,一个评论只属于一个文章#评论文章
    article = models.ForeignKey("Article")
    #评论用户
    user = models.ForeignKey("UserProfile")
    #评论内容
    comment = models.TextField(max_length=1000)
    #评论时间
    date = models.DateTimeField(auto_now=True)

    #多级评论,是不是评论评论的当前的表(自己表),所以就得和自己做一个关联!#这里在关联自己的时候必须设置一个related_name否则会报错冲突#这里parent_comment,必须设置为可以为空,因为如果他是第一评论他是没有父ID的
    parent_comment = models.ForeignKey("self",related_name=p_comment,blank=True,null=True)
    ‘‘‘
    prent self
    Null    1
    1       2
    1       3
    2       4
    通过上面的这种方法来记录,评论的级别关系!
    ‘‘‘def __unicode__(self):
        return "<user:%s>" %(self.user)
class ThumbUp(models.Model):
    ‘‘‘
    点赞
    ‘‘‘#给那个文章点的
    article = models.ForeignKey(Article)
    #用户名
    user = models.ForeignKey(UserProfile)
    #时间
    date = models.DateTimeField(auto_now=True)


class Category(models.Model):
    ‘‘‘
    板块表
    ‘‘‘#板块名称
    name = models.CharField(max_length=64,unique=True,verbose_name="板块名称")
    #板块管理员
    admin = models.ManyToManyField("UserProfile",verbose_name="模块管理员")
    def __unicode__(self):
        return self.name

class UserProfile(models.Model):
    ‘‘‘
    用户表
    ‘‘‘#使用Django提供的用户表,直接继承就可以了.在原生的User表里扩展!(原生的User表里就有用户名和密码)#一定要使用OneToOne,如果是正常的ForeignKey的话就表示User中的记录可以对应UserProfile中的多条记录!#并且OneToOne的实现不是在SQL级别实现的而是在代码基本实现的!
    user = models.OneToOneField(User)
    #名字
    name = models.CharField(max_length=32)
    #属组
    groups = models.ManyToManyField("UserGroup")

    def __unicode__(self):
        return self.name

class UserGroup(models.Model):
    ‘‘‘
    用户组表
    ‘‘‘
    name = models.CharField(max_length=64,unique=True)
    def __unicode__(self):
        return self.name
技术分享

 

配置Django Admin

配置admin注册model,不要忘记创建Django 管理员用户

技术分享
from django.contrib import admin
import models
# Register your models here.
admin.site.register(models.Article)
admin.site.register(models.Category)
admin.site.register(models.Comment)
admin.site.register(models.ThumbUp)
admin.site.register(models.UserProfile)
admin.site.register(models.UserGroup)
技术分享

我创建了几个板块,我在板块中查看的时候。只能看到下面简单的信息:

技术分享

这里我想看到板块中的ID或其他信息怎么办?

技术分享
#!/usr/bin/env python
#-*- coding:utf-8 -*-from django.contrib import admin
import models
# Register your models here.#给某个表专门的定制的类class CategoryAdmin(admin.ModelAdmin):
    list_display = (id,name)

class ArticleAdmin(admin.ModelAdmin):
    list_display = (id,title,author,hidden,publish_date)

admin.site.register(models.Article,ArticleAdmin) #把自定义的类绑定到注册的类中
admin.site.register(models.Category,CategoryAdmin)  #把自定义的类绑定到注册的类中admin.site.register(models.Comment)
admin.site.register(models.ThumbUp)
admin.site.register(models.UserProfile)
admin.site.register(models.UserGroup)
技术分享

效果如下:

技术分享

前端页面&URLorViews配置

1、url别名使用

url里配置别名

url(r^category/(\\d+)/$,views.category,name=category),

html里配置的时候就只认那个别名了

          <li role="presentation"><a href="{% url ‘category‘ 1 %}">欧美专区</a></li><li role="presentation"><a href="{% url ‘category‘ 2 %}">日韩专区</a></li><li role="presentation"><a href="{% url ‘category‘ 3 %}">印度专区</a></li>

别名的好处:如果说那天想修改url里的这个url名称了,是不是所有前端都得修改!并且在有好几层的时候怎么改使用别名就会非常方便了!

2、前端页面写完之后发现图片无法正常显示

技术分享

出现这个问题的原因:他能找到uploads这个目录吗?他能直接访问这个目录吗?他不能直接访问不了!

  • 一个是在Linux环境下做一个软连接连接过去

如果在settings里加入uploads这个目录,但是这个方法还是有问题!他会去找/static/uploads/uploads目录,看下面的图!

技术分享

但是通过下面的方式就可以访问(原因就是因为:他去/static/uploads/uploads目录找了)

技术分享

2.2、我们自己写上传的方法

 定义form表单认证