BBS总结 --- django设计

目录

  • 1.调用模块使用
  • 2.BBS中urls.py
  • 3.django中配置
  • 4.新学方法使用
  • 5.BBS用到的知识点

1.调用模块使用

from django.db import models
from django.contrib.auth.models import AbstractUser

from django import forms

from django.shortcuts import render, HttpResponse, redirect, reverse
from django.http import JsonResponse
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO, StringIO
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.db.models.functions import TruncMonth
from django.db.models import Count
from django.db.models import F
from django.utils.safestring import mark_safe
import json
import random

from django.db import transaction
from bs4 import BeautifulSoup
import os
from BBS import settings

2.BBS中urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.views.static import serve
from BBS import settings
from django.conf import settings
from django.conf.urls import include

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # 注册
    url(r'^register/', views.register, name='register'),
    # 登录
    url(r'^login/', views.login,name='login'),
    # 验证码
    url(r'^get_code/', views.get_code, name='get_code'),
    # 退出
    url(r'^logout/',views.logout,name='logout'),
    # 主页
    url(r'^home/', views.home, name='home'),
    # 修改密码
    url(r'set_password/',views.set_password,name='ser_password'),
    # 点赞点踩
    url(r'^up_down/', views.updown),
    # 评论业务逻辑
    url(r'^comment/',views.comment),
    # 后台管理页面
    url(r'^backend/',views.backend,name='backend'),
    # 新增文章
    url(r'^add_artilce',views.add_article,name='add_article'),
    # 上传图片
    url(r'^upload_img/',views.upload_img,name='upload_img'),
    # 更改头像
    url(r'^(?P<username>.*)/set_avatar/',views.set_avatar,name='set_avatar'),

    # 手动开设后端资源   将media中的资源全部开放给外界
    url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),

    # 个人站点
    url(r'^(?P<username>\w+)/$', views.site, name='username'),
    # 404页面
    url(r'^error/',views.site,name='error'),
    # 侧边栏功能
    url(r'^(?P<username>\w+)/(?P<condition>category|tag|archive)/(?P<param>.*)/', views.site),

    # 文章页面
    url(r'^(?P<username>\w+)/article/(?P<param>.*)/', views.article_detail, name='article_detail'),
]

3.django中配置

1.mysql数据库配置

settings中

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs1',
        'HOST':'127.0.0.1',
        'POST':3306,
        'USER':'root',
        'PASSWORD':'123',
        'CHARSET':'utf8'
    }
}

init中

import pymysql
pymysql.install_as_MySQLdb()

2.app注册

INSTALLED_APPS = [
    'APP01.apps.App01Config',
]

3.template配置

TEMPLATES = [
    {'DIRS': [os.path.join(BASE_DIR, 'templates')]}

4.时间报错

USE_TZ = False

5.更改路由前缀

STATIC_URL = '/static/'

6.静态文件路径匹配

STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),]

7.使用auth联合创建表

AUTH_USER_MODEL = 'APP01.Userinfo'

8.auth模块的登录装饰器

LOGIN_URL = '/login/'

9.开设后端资源

MEDIA_ROOT = os.path.join(BASE_DIR,'media')   # 开设后端资源

url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT}),

10.test.py文件使用配置

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BBS1.settings")
    import django
    django.setup()

4.新学方法使用

1.数据库优化

将点赞点踩的数量随着数据的录入依次递加,不用之后再进行统计

2.子评论

自己跟自己进行一对多关联

parent = models.ForeignKey(to='self',null=True)

3.多对多创建第三章表

from django.db import models
from django.contrib.auth.models import AbstractUser
class Tag2Article(models.Model):
    article = models.ForeignKey(to='Article')
    tag = models.ForeignKey(to='Tag')

注意点:第三张表继承的是models,字段是进行一对多关联的

4.随机验证码

# 产生随机字符
def get_random():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

# 随机验证码
def get_code(request):
    # 正式显示
    img_obj = Image.new('RGB', (360, 35), get_random())  # 生成一张图片
    img_draw = ImageDraw.Draw(img_obj)  # 让这张图片可以进行编辑
    img_font = ImageFont.truetype('static/font/Wesley.ttf', 30)  # 生成字体
    print(get_random(), '我是get_random')
    # 随机验证码 大小写英文加数字,四位,每一位都可以是大写字母或是小写字母
    code = ''
    for i in range(4):
        upper_str = chr(random.randint(65, 90))
        lower_str = chr(random.randint(97, 122))
        random_int = str(random.randint(0, 9))
        tmp = random.choice([upper_str, lower_str, random_int])
        img_draw.text((i*60+60,0), tmp, get_random(), img_font)
        code += tmp
    print(code)
    # 将生成的随机字符串放在session中,方便之后调用
    request.session['code'] = code
    io_obj = BytesIO()
    img_obj.save(io_obj, 'png')
    return HttpResponse(io_obj.getvalue())

5.在form表单中

利用form标签内部的一个自动化序列产生键值对的方式来添加键值对
$('#myform').serializeArray()   # 可以拿到form表单中的所有键值对,不能拿到文件

$.each($('#myform').serializeArray(),function (index,obj) {
            MyFormData.append(obj.name,obj.value) });

# index 索引序号       obj  对象{'':''}
# 将form表单中的键值对循环添加进MyFormData中
# each相当于for循环,对键值对有效

{{forms.auto_id}}   # id_username

6.输入框错误

{{forms.errors}}    # 错误信息提示
class:"has_error"   # 有错的时候文本框变红

7.attr与val与text

8.更换头像

<div class="form-group">
     <p>上传头像</p>
     <label for="id_file">
           <img src="/static/img/default.jpg" alt="" width=150px id="img">
      </label>
      <input type="file" id="id_file" style="display: none" name="avatar">
</div>

$('#id_file').change(function () {
        // 使用内置对象对文件进行读取
        let MyFileReader = new FileReader();
        // 获取用户上传的文件对象
        let fileObj = $(this)[0].files[0];
        // 让文件阅读器读取文件
        MyFileReader.readAsDataURL(fileObj);
        // 将读取之后的内容换到img标签的src属性中
        MyFileReader.onload = function () {
            $('#img').attr('src',MyFileReader.result)
        }
    });

9.登录的时候错误提示

$.each(data.msg,function (index,obj) {
     let targetId = '#id_'+index;
     $(targetId).next().text(obj[0]).parent().addClass('has-error')

10.验证码实时刷新

<div>
     <p><label for="id_yanzheng">验证码</label></p>
     <div class="col-md-6"><input type="text" class="form-group form-control" id="id_yanzheng"></div>
     <div class="col-md-6 pull-right"><img src="/get_image/" alt="" width="360" height="35" id="id_img"></div>
</div>

let oldPath = $('#id_img').attr('src');
    $('#id_img').attr('src',oldPath+='?')

11.inclusion_tag的使用

1.创建一个新的文件夹templatetags,新建一个py文件

2.将需要产生数据的代码写在py文件中

from django.template import Library

register = Library()
@register.inclusion_tag('pag/left_page.html')    # 指向需要接收数据的html文件,将数据渲染
def my_menu(username):
    return locals()

3.调用的时候,在使用的地方写入下边代码

{% load mytag %}         # 文件名

{% my_menu username %}   # username是需要传入的参数

12.展示用户头像

1.先将后端的文件访问打开,进行配置

 <div class="media-left media-middle">
     <a href="/{{ article.blog.userinfo.username }}/">
     <img class="media-object" src="/media/{{ article.blog.userinfo.avatar }}" alt="..." width="60px">
     </a>
</div>

13.点赞点踩

注意点:将数据在前端也进行渲染

是那个用户点击了那篇文章,是点赞还是点踩

<!--点赞点踩开始-->
    <div class="clearfix">
     <!--点踩开始-->
        <div class="buryit action">
            <span class="burynum" id="bury_count">0</span>
        </div>
        <!--点踩结束-->
        <!--点赞开始-->
        <div class="diggit action">
            <span class="diggnum" id="digg_count">0</span>
        </div>
        <!--点赞结束-->
        <div class="clear"></div>
        <div class="diggword" id="digg_tips">
            <span class="info pull-right" style="color: red"></span>
        </div>
    </div>

// 点赞点踩
    $('.action').click(function () {
        let is_up = $(this).hasClass('diggit');    # 绑定一个,点击的时候的为true,其他为false
        let $target = $(this);
        $.ajax({
            url:'/{{ user_obj.username }}/article/{{ article_obj.pk }}/',   // 放需要连接的路径
            type:'post',
            data:{'is_up':is_up},   // 放需要发送到前端的数据
            success:function (data) {
                if(data.code == 1000){
                    $('.info').text(data.msg);
                    let $span = $target.children();
                    let oldNum = $span.text();
                    $span.text(Number(oldNum)+1);
                }else {
                    if(data.code==2000){
                        $('.info').text(data.msg);
                    let $span = $target.children();
                    let oldNum = $span.text();
                    $span.text(Number(oldNum)+1);
                    }else {
                        $('.info').text(data.msg);
                    }
                }
            }
        });
    });

14.评论

注意点:包括子评论

<!--评论内容显示开始-->
    <div>
        <p><h4>评论</h4></p>
        <hr>
    <ul class="list-group">
        {% for comment in comment_obj %}
        <p style="color: red;">#{{ forloop.counter }}楼&nbsp;&nbsp;<a href="/{{ request.user.username }}/">{{ comment.user.username }}</a>评论了你
            <a class="pull-right reply" username="{{ request.user.username }}" comment_id="{{ comment.pk }}">回复</a></p>
         <li class="">{{ comment.comment_text }}</li>
            <hr>
    {% endfor %}
    </ul>

    </div>
    <!--评论内容显示结束-->

    <!--评论内容显示开始-->
    <div>
        <hr>
        {% if request.user.is_authenticated %}
            <div>
                <p>发表评论</p>
                <p>
                    昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50"
                              value="{{ request.user.username }}">
                </p>
                <p>评论内容:</p>
                <p>
                    <textarea name="comment" id="id_comment" cols="60" rows="10"></textarea>
                </p>
                <button class="btn btn-primary" id="id_submit">提交评论</button>
            </div>
    <!--评论结束-->

            {% else %}
                <p><a href="{% url 'login' %}">登录</a>
                    <a href="{% url 'register' %}">注册</a>
                </p>
        {% endif %}
        <br>
        <br>
    </div>
    <!--评论内容显示结束-->
// 评论表
    // 提前定义一个全局变量parentId
    let parentId = null;
    $('#id_submit').click(function () {
        $.ajax({
            url:'/comment/',
            type:'post',
            data:{
                article_id:{{ article_obj.pk }},
                comment:$('#id_comment').val(),
                parent_id:parentId
            },
            success:function (data) {
                if(data.code == 1000){
                    let userName = '{{ request.user.username}}';
                    let conntent = $('#id_comment').val();
                    let tmp = `
                    <li class="list-group-item">
                        <span><span class="glyphicon glyphicon-comment"></span><a href="/${ userName}/">${userName}:</a></span>
                        <p>
                            ${conntent}
                        </p>
                    </li>
                    `;
                    // 将生成好的内容添加到ul标签内部
                    $('.list-group').append(tmp);
                    // 将评论框清空
                    $('#id_comment').val('');
                    // 将全部的parent变成空
                    parentId = null;
                }
            }
        });
    });

    // 子评论,
        $('.reply').click(function () {
            // 哪个用户回复了哪一篇文章中的那一条评论
            let userName = $(this).attr('username');
            // 获取想要评论的呢条评论内容的主键值
            parentId = $(this).attr('comment_id');
            // 回复按钮做的三件事情
            let headerMsg = '@' + userName +'\n';
            $('#id_comment').val(headerMsg);
            $('#id_comment').focus();
        })

5.BBS用到的知识点

1.第三张表的创建

2.表之前的关系

3.forms组件

4.auth模块

5.点击事件 click

6.更改事件 change

7.jquery选择器

8.attr,val,text

9.随机验证码

10.小白三板斧

11.ajax

12.form表单

13.form表单循环添加功能

14.上传图片更换

15.后台文件开放

16.有名分组与无名分组

17.反向解析

18.模板语法

19.正则表达式

20.数据库优化原理

原文地址:https://www.cnblogs.com/whkzm/p/12045618.html

时间: 2024-10-12 12:19:05

BBS总结 --- django设计的相关文章

2014-07-28 使用Axure RP进行手机端BBS的原型设计

今天是在吾索实习的第14天.因本公司的微信公众号需要有一个对外的技术交流平台,所以我们小组打算设计一个手机端的BBS以满足其要求.首先,我们需要做的是进行数据库设计与原型设计,然后提交给经理验收,看看是否合理,是否满足其所要求. 对于原型的设计,我们不需要也不必使用Dreamweaver等设计网站的专门工具进行设计,因为那样不仅增长了原型设计的时间,也加大了原型设计的复杂性.因此,我们需要一种能快速.简便地创建出网站架构图的专门工具:Axure RP.RP的使用是相当的方便的,只需把自己所需的控

Django数据库设计中字段为空的方式

null=True 数据库中字段可以为空 blank=True django的 Admin 中添加数据时可允许空值 原文: 今天在做数据库设计的时候,设计了如下User表,其中我把email和phone字段设置为允许为空: 1 class User(models.Model): 2 username = models.CharField('用户名',max_length=50) 3 password = models.CharField('密码',max_length=255) 4 email

Django基础和基本使用

Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的方法: Django优点 自带轮子众多,方便快速开发 如Auth,Cache,模板等 天生的MVC设计模块 实用的后台管理 自带ORM,Template,Form,Auth核心组件 简洁的url设计 周边插件丰富 Django缺点 重 同步阻

python django框架(一)

s4day63内容回顾: 1. 安装 2. 创建用户 + 授权 3. 连接 - 数据库 终端创建数据库(字符编码) - 数据表 终端 ORM pymysql create ...)engine=innodb - 数据行 增 删 改 查 - limit - group by .... 关闭 问题:简述ORM原理? day64内容 1. 自己开发Web框架 - socket - http协议 - HTML知识 - 数据库(pymysql,SQLAlchemy) HTTP特点: 无状态.短连接 TCP

Django模型开发 --python数据库连接

在Django中,视图负责处理一些业务逻辑,然后返回响应结果.在当代Web应用中,业务逻辑经常牵涉到与数据库的交互,在后台连接数据库服务器,从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据.这个网站也可能会向访问者提供修改数据库数据的方法. 在这一篇博文中,我们将以MySQL数据库为例,先看看不使用Django模型的数据库查询方法,然后开始学习Django的模型. 1. 不使用模型的数据库查询方法 假如我们不采用Django的模型,如何从数据库中获取数据呢?通常的做法就是在视图(Vie

Django -- 模型(数据库层)

web应用中,主观逻辑(视图处理)经常牵涉与数据库的交互.数据库驱动网站在后台连接数据库,从中取数据,然后甩漂亮界面展现在web端.许多复杂的网站都提供以上两种功能的结合(如Amazon.com),而Python天生具备简单强大的数据库查询执行方法,很适合开发这类数据库驱动网站. 他就是下面介绍的Django数据库层! [ 硬 编 码 链 接 数 据 库 ] cat ~/HelloWorld/HelloWorld/view.py from django.shortcuts import rend

利用django创建一个投票网站(三)

创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」.比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页--展示最近的几项内容. 内容"详情"页--详细展示某项内容. 以年为单位的归档页--展示选中的年份里各个月份创建的内容. 以月为单位的归档页--展示选中的月份里各

我为什么不用Django而用Flask?

前言 对于初学者来说,找到一个好的框架来学习或者项目开发都是非常有必要的,而当你有一定开发经验后,你应该选择适合当前业务需要的框架.我这里并不想探讨哪个框架好哪个不好,这个永恒的话题就跟探讨"世界上哪种编程语言最屌"是一样的. 分析 面对一个项目需求,不要着急去开发,学会控制开发成本的前提是明白技术难点可能带来的额外的时间消耗.对于我这种中级Python开发人员来说,并没有实质上的项目经验,没有开发过大型的线上项目,无非是爬虫写了一堆又一堆,本质上跟初学者差别不大,充其量也就算一个编码

hibernate中一对多关系模式的设计

hibernate中一对多的关系模式的设计 注解应该交由多的一方维护和管理. 例如:bbs的模块设计 三个表 版块表(category) .主题帖表(topic)和回帖表(msg) 他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴. 以下是对应的建表语句. CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (