BBS项目(三):侧边栏筛选功能 文章详情页搭建 点赞点踩功能 文章根评论功能
复习与补充
admin后台管理复习:
admin.py文件中注册模型表 然后访问admin路由使用超级管理员登录
admin.site.register(models.UserInfo)
"""
1.后台可以不填写某字段
blank=True
2.后台显示表名
class Meta:
verbose_name_plural = ''
"""
ps:绑定关系要细心
功能补充:
1. 用户注册之后自动生成站点
之前我们用户注册之后,站点和用户之间的关系没有绑定。可以在用户注册时,输入有关站点的信息,注册完成之后,直接录入站点表,自动生成个人站点
2. 个人站点名字扩展
之前我们的站点名字 和 站点路由名是相同的,应该支持用户自定义站点名。
侧边栏筛选功能
1.先研究博客园三种情况下的筛选特性
分类筛选路由特性: 站点名称/category/数据主键值
标签筛选路由特性: 站点名称/tag/数据主键值
日期筛选路由特性: 站点名称/archive/文章年月
2.研究路由开设接口
多个路由使用相同的视图函数 因为个人站点的文章和侧边栏筛选的文章互为父子集
# 侧边栏筛选接口
# path('<str:username>/category/<int:category_id>/', views.site_func),
# path('<str:username>/tag/<int:tag_id>/', views.site_func),
# path('<str:username>/archive/<str:yearAndmonth>/', views.site_func),
# 上述三个路由可以合并成一个路由
re_path('^(?P<username>\w+)/(?P<condition>category|tag|archive)/(?P<params>.*?)/', views.site_func)
由于以上路由传递的实参个数不相同,所以在视图函数我们可以使用可变长形参接受:
# def site_func(request,username,**kwargs):
3.由于筛选还是基于个人站点 所以多个路由使用相同的视图函数
通过视图函数接收的实参个数不同从而区分不同的业务逻辑
4.侧边栏筛选后端逻辑
个人站点页主体部分:
正常情况下:个人站点应该展示所有文章
经过侧边栏筛选: 展示被筛选的部分文章
个人站点侧边栏部分:
侧边栏的分类、标签、日期依旧是根据该用户的所有文章生成的,与侧边栏筛选之后的结果无关。
5.根据条件二次过滤文章数据
正反向查询、神奇的双下划线查询
文章详情页搭建
1.路由的设计
站点名称/article/数据主键值
开设新路由
2.侧边栏制作inclusion_tag
对于侧边栏这局部的html代码要在好几个页面使用,并且这个html中用到的数据是动态渲染的。
所以要使用inclusion_tag来进行实现。也可以在视图函数重新写orm,但是重复的代码太多,不建议这么做。
2.1侧边栏很多页面都需要使用 并且还需要传参才可以加载出来
2.2干脆制作成inclusion_tag调用 从而节省代码
2.3自定义操作固定步骤(模板层相关知识)
3.文章详情页后端逻辑
开设新路由 ---> 筛选用户写的文章(查询1篇) ---> 前端模板继承 ---> 侧边栏数据丢失 ---> 使用inclusion_tag ---> 获取外部文章html代码 ---> safe信任html代码
点赞点踩样式搭建
1.数据准备
直接拷贝博客园样式即可 主要除了html还有css 遇到图片防盗链问题,就将图片下载到本地
2.针对路由匹配
含有动态匹配的路由很多时候可能会出现顶替的情况
这个时候我们可以将简单的路由放前面 复杂的放后面 甚至修改匹配策略
点赞点踩功能完善
1.前端页面给点赞点踩图标绑定点击事件
通过标签class值的不同区分是赞还是踩
发送ajax请求携带文章主键值、点赞点踩...
2.后端业务逻辑
校验用户是否登录、校验当前用户是否是文章作者、校验当前用户是否已经点过、完成数据库操作(注意普通字段数据更新)
ps:注意前端发送过来的js类型的布尔值需要自己处理成python布尔值
3.前端展示优化
信息提示、数字动态变化
ps:针对标签文本需要做类型转换 否则默认是字符串拼接
文章评论前期准备
1.前端样式搭建
最简易的几个标签
获取用户输入的textarea以及一个提交按钮
2.评论逻辑
先考虑根评论 之后再考虑子评论 不要乱!!!
3.根评论
点击提交评论按钮 发送ajax请求 携带必要的参数即可
文章根评论业务逻辑
1.给提交按钮绑定点击事件
2.发送ajax请求
携带评论内容、文章主键
3.后端直接获取数据并写入数据库
还是得注意文章表中的普通字段
ps:很多业务逻辑可能需要执行多条ORM语句 这个时候为了保证数据的完整可以采用事务操作(回想ORM事务的三种操作方式)
练习
1.整理今日内容及思路
2.连续功能编写
先理清逻辑再动手
ps:编写功能可以先一条道走到黑之后再考虑其他情况
BBS项目(三):侧边栏筛选功能 文章详情页搭建 点赞点踩功能 文章根评论功能的更多相关文章
- BBS之文章详情页搭建
博客评论相关 博客文章详情页搭建 {% extends 'base.html' %} {% block css %} <style> #div_digg { float: right; m ...
- thinkPHP中的文章详情页实现“上一篇下一篇”功能经验分享
前段时间在公司中接触到了用thinkPHP搭建的项目,其中涉及到了文章详情页上一篇下一篇翻页的功能实现效果. 因为刚接触这套框架和PHP,所以整理一下实现该功能的经验方法. 如果有不到位的地方,欢迎指 ...
- Thinkphp 3.2中文章详情页的上一篇 下一篇文章功能
额 简单2句话解释下 获取上一篇文章的原理,其实就是以当前文章的id为起点进行进行查询,例如id=5的文章 select * from article where (article_id<5 ...
- BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)
BBS项目分布搭建三(个人站点时间归档补充,) 1. 个人站点时间归档 """ settings.py设置最好更改以下: LANGUAGE_CODE = 'zh-hans ...
- django博客项目8:文章详情页
首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...
- Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页
背景: 文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能.页面长这个样子: 方案: 1.点击登录链接时,将该页面的URL传递到登录视图中 request.path获取的是当前页面的相对路 ...
- Django----使用模板系统渲染博客页面、实现列表和详情页的跳转、前后跳转功能
.模板写法同Flask,可以参考之前的FLask-模板 .将之前的BootStrap静态页面中的数据使用模板写 <!DOCTYPE html> <html lang="en ...
- python 全栈开发,Day81(博客系统个人主页,文章详情页)
一.个人主页 随笔分类 需求:查询当前站点每一个分类的名称以及对应的文章数 完成这个需求,就可以展示左侧的分类 它需要利用分组查询,那么必须要会基于双下划线的查询. 基于双下划线的查询,简单来讲,就是 ...
- [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
- [ionic开源项目教程] - 第9讲 新闻详情页的实现
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
随机推荐
- 【题解】HD2016.X1,HD2016.X3,HD2016.X4,HD2016.X5
[HD2016.X1] 价钱统计 题目描述 夏天到了,超市里摆满了各种各样的应季水果.现在知道:西瓜的价钱是每斤 1.2 元:桃子的价钱是每斤 3.5 元:葡萄的价钱是每斤 4.5 元:苹果的价钱是每 ...
- Mysql数据库插入数据时出现Unknown column ‘admin‘ in ‘field list‘错误
报错内容 报错原因 字段和插入的值所用的引号不对 解决方案 insert into t_user(`username`,`password`,`email`) VALUES(`admin`,`admi ...
- 聊聊数据库连接池 Druid
在 Spring Boot 项目中,数据库连接池已经成为标配,然而,我曾经遇到过不少连接池异常导致业务错误的事故.很多经验丰富的工程师也可能不小心在这方面出现问题. 在这篇文章中,我们将探讨数据库连接 ...
- MongoDB入门级别教程全(Windows版,保姆级教程)
下载mongodb 进入官网: Download MongoDB Community Server | MongoDB 选择msi,Windows版本 下载完后直接双击: 选择complete 这里建 ...
- [UOJ#748] [UNR#6 1B] 机器人表演
在这个科技发达的年代,真人表演已经落伍了.参加完 UOI 后,hehe 蚤去到了下山市大剧院,观看下山市最火爆的机器人表演. 机器人有时比人类更能抓住事情的本质.所谓表演,其实也就是开场有若干个机器人 ...
- 向mq写消息
1.基础版本 import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.comm ...
- 聊聊kube-scheduler如何完成调度和调整调度权重
本文分享自华为云社区<kube-scheduler如何完成调度和调整调度权重>,作者: 可以交个朋友. 一.概述 Kube-scheduler作为k8s集群的默认调度器,它监听(watch ...
- 组合式api-ref引用子组件、dom元素, defineExpose的使用
和vue2一样,我们有时候希望父组件能够调用子组件中的方法.属性.那么就要用到ref. 然后你会发现,根本调用不了子组件中的方法"sonSayHi",如下图: 原因: 使用
- Kernel Memory 入门系列:生成并获取文档摘要
Kernel Memory 入门系列:生成并获取文档摘要 前面在RAG和文档预处理的流程中,我们得到一个解决方案,可以让用户直接获取最终的问题答案. 但是实际的业务场景中,仍然存在一些基础的场景,不需 ...
- 文心一言 VS 讯飞星火 VS chatgpt (171)-- 算法导论13.2 4题
四.用go语言,证明:任何一棵含n个结点的二叉搜索树可以通过 O(n)次旋转,转变为其他任何一棵含n个结点的二叉搜索树.(提示:先证明至多n-1次右旋足以将树转变为一条右侧伸展的链.) 文心一言: 这 ...