• Django--BBS项目



    需求

    模仿抽屉()和虎嗅()做一个网站bbs

    知识点

      Django知识:

      • models表字段第一个属性可以用 u"别名" 标明字段名称,效果同 verbose_name='别名'

      • 使用Django自带的用户认证表  from django.contrib.auth.models import User ,里面包含了username和password等,它是一对一的关系,即每个账户对应了自己的一个关联表;

      • 评论只是多一个parent字段,外键是"self",然后用递归函数取出;

      • models.create()方法只返回true or false ,save()方法能返回具体;

      • migrate只创建auth和Django表,不会创建自己的表;

      • 自关联ForeignKey("self")的时候,要加参数 related_name,而且名字不能和外键字段名称相同;因为反向查询的时候,Comment.parent_comment和Comment.comment会冲突。
      • blank=True,是Django-admin页面中可以为空,null=True,代表数据库中可以为空;

      • STATIC_URL= '/static/'代表了遍历STATICFILES_DIRS中所有的目录,所以调用的时候就写/static/...;
      • urls映射表起别名,name=“别名”,前端调用:{% url '别名'  %},url名称无论更改与否,都不会影响;
      • 上传文件小于2.5M会存储在内存,大于2.5M会创建临时文件;

      前端知识:

      • request.path 获取用户请求url路径,不包括ip和端口

      • bootstrap,一行12格,外层div要有class=‘row’,里层div直接写占几格col-md-x;

      • models反向查询:通过谁关联我的表,可以取到table_set的一个集合,再通过select_related,将集合变成一个列表,从而可以计算数量;
      • 列表水平排列:<ul class="list-inline"><li>.....</ul>
      • CSRF:<form>{% csrf_token %};view中必须用render返回;

      • bootstrap中使元素移到最右边:class='pull-right'  ;

      • 文章后发布在前面,用reversed,{% for  article in articles reversed%}

      ckeditor编辑器

      1. 发表文章正文使用

      2. 前端母版simpletag定义block head-js,子版引用block,调取ckeditor的js文件

      3. form中写一个textarea标签,id(js查找),name(提交后台)不可少;

      4. 前端母版simpletag定义block bottom-js,子版引用block,自写javascript;

      5. 只一行:CKEDITOR.replace('id');

      6. 还可自写配置: CKEDITOR.editorConfig = function(config){};   定义样式等等。

      7. 正文的格式带标签:{{ article_obj.content | safe }} 这样就解决了。




      项目步骤

      1、设计数据库

      创建表:

      用户表、用户组表、文章表、板块表、评论表、点赞表。

      表中包括的字段:
      • 用户表:账户、真实姓名、用户属组

      • 用户组表:组名

      • 文章表:文章名、所属板块、标题图片、内容、作者、发布时间、是否隐藏、优先级

      • 板块表:板块名称、版主

      • 评论表:文章名、父评论、评论内容、评论时间

      • 点赞表:文章名、用户、点赞时间

      初始化数据库

      2、admin页面

      1. 将models表加入admin

      2. 后台中添加文章,评论等,跑通流程

      3、前端页面

      1. Bootstrap页面index.html

      2. urls配置、views配置

      3. 用户登录后的dropdown下拉菜单,在前端用if判断,如果登录了就显示注销啥的,没登录就显示注册和登录按钮

      4. logout注销,urls,views,用Django原生logout函数

      5. 主页当成模板,其它板块页面(simple_tag母版继承、板块用动态id),所以综合区不能用动态id过滤;

      6. admin后台加入板块,并自定义显示信息;

      7. 各板块的标签active转换效果

      8. 综合板块前端页面index.html,(左右栏占比,文章栏)

      9. 每个文章的链接、文章页面、文章不存在异常处理、404页面;图片要等发布做完才能显示,因为这时数据库中的路径不能获取到;

      4、登录

      1. 登录页面login.html

      2. 登录后右上角显示登录状态,登出

      5、用户操作

      1. 发帖,右上角下拉菜单做一个发帖选项

      2. form表单验证合法性

      3. 数据库插入数据

      4. 发布成功显示什么,没有这个文章id就创建。。。

      5. 最新发布的文章置顶,用reverse查询

      6. 图片上传功能完善,img传到每个用户自己的目录里

      7. 分级评论


      一些新知识

      models:原生User表

      1
      2
      3
      from django.contrib.auth.models import User
      class UserInfo(models.Model):
          username = models.OneToOneField(User)

      admin:显示多个字段

      1
      2
      3
      class ArticleAdmin(admin.ModelAdmin):
          list_display = ('id','title','author','hidden','publish_date')
      admin.site.register(models.Article,ArticleAdmin)

      显示‘账户名’或‘登录’按钮​:

      1
      2
      3
      4
      5
      {% if request.user.is_authenticated %}
          显示用户登录后的下拉列表
      {% else %}
          显示登录信息
      {% endif %}

      板块按数字分页:

      1
      url(r'^plate/(d+)$', views.plate,name='plate')

      1
      2
      3
      def plate(request,plate_num):
          articles = models.Article.objects.filter(plate_id=plate_num)
          return render(request,'index.html',{'articles':articles})

      1
      <a href="{% url 'plate' 2 %}">板块2</a>

      标签切换高亮:

      1
      2
      3
      4
      5
      $(function(){
          var menus = $("#plate a[href='{{ request.path }}']")[0];
          $(menus).parent().addClass('active-blue');
          $(menus).parent().siblings().removeClass('active-blue');
      });

      文章详细页:

      1
      <a href="{% url 'article' article.id %}">{{ article.title }}</a>

      1
      url(r'^article/(d+)$', views.article,name='article')

      1
      2
      3
      def article(request,article_id):
          article_obj = models.Article.objects.get(id=article_id)
          return render(request,'article.html',{'article_obj':article_obj})



      详细

      参考:day20课上代码或homework



















    • 相关阅读:
      <td>标签clospan和rowspan 可横跨列数和行数
      网线水晶头接法
      安装在墙上的网线接口坏了的处理方法
      php array 数组及数组索引
      php strpos返回字符串首次出现的位置
      escape()、encodeURI()、encodeURIComponent()区别详解
      smarty assign 赋值
      二叉搜索树(搜索二叉树)转换成一个双向链表
      new malloc和delete free 的区别
      两个栈实现一个队列
    • 原文地址:https://www.cnblogs.com/daliangtou/p/5346867.html
    Copyright © 2020-2023  润新知