Diango项目-简易个人博客项目

  • 项目实现功能

  1. 在admin后台自定义添加上传文档。
  2. 对展示在首页的文章分页显示。
  3. 在首页点击文章的阅读全文按钮可进入该文章全文详情页进行浏览。
  4. 对文章实现了内容分类何以发布时间进行归档分类。
  5. 使用django的whoose搜索引擎对全文实现内容的搜索。
  • 项目涉及技术

Mysql   Django   Python redis

  • 项目核心实现流程

  1. 确定索要发布的文章展示的样式排版(时间,作者,标签,分类,简介等等),在django的models确定对应的字段形式(注意表与表之间,字段与字段之间的对应关系,一对多OR多对多,比如文章和分类可以实现多对一(一个分类包含多篇文章类型),文章与标签之间是多对多的关系)
  2. object.get.all()获取数据库的对象内容,在首页的前端页面循环遍历显示即可,至于点击阅读全文按钮进入详情页面在url给定路由后path('page/<int:num>',views.queryAll),我们这里根据点击识别的不同文章的id来获取该文章的内容,

    postid = int(postid)
    # 根据postid查询帖子的详情信息
    post = Post.objects.get(id=postid)然后再详情内容页面讲该文章post.各种字段(分类,简介,内容,时间等等)放在页面对应的变迁文本里即可。

  3. 分页:使用Django的自带的Pagintor,技术步骤如下结合自己的项目中需要展示的数据库里的数据即可1.导入Paginator类和EmptyPage、PageNotAnInteger异常类; 2.获取需要分页的数据列表; 3.创建Paginator对象,指定每页显示的数据条数; 4.获取当前页码数,如果没有获取到则默认为第一页; 5.获取当前页的数据,如果页码数不是整数或者超出范围则抛出异常; 6.根据总页数决定显示的页码范围; 7.将分页后的数据传递给模板进行渲染

  4. 对文章的归档(按照类别,时间),

     #1.获取分类信息
        r_catepost         =Post.objects.values('category__cname','category').annotate(c=Count('*')).order_by('-c')
        #2.近期文章
        r_recpost = Post.objects.all().order_by('-created')[:3]
        #3.获取日期归档信息
        from django.db import connection
        cursor = connection.cursor()
        cursor.execute("select created,count('*') c from t_post GROUP BY         DATE_FORMAT(created,'%Y-%m') ORDER BY c desc,created desc")
        r_filepost = cursor.fetchall()

        以上代码用来获取以不同划分特点来获取数据库中的指定内容对象,

        分类url:

        <a class="category-list-link"
        href="/post/category/{{ cp.category }}">{{ cp.category__cname }}</a>

        归档url:

        <a class="archive-list-link"
        href="/post/archive/{{ fp.0|date:'Y' }}/{{ fp.0|date:'m' }}">{{ fp.0|date:'Y年m月' }}</a>

        最近文章url(同阅读全文链接地址):<a href="/post/post/{{ rp.id }}" target="_blank">{{         rp.title|truncatechars:10 }}</a>

     5.分享,直接调用百度分享的api接口即可:代码如下:

        <div class="bdsharebuttonbox"><a href="#" class="bds_more" data-cmd="more"></a><a href="#" class="bds_qzone" data-cmd="qzone"></a><a href="#" class="bds_tsina" data-cmd="tsina"></a><a href="#" class="bds_tqq" data-cmd="tqq"></a><a href="#" class="bds_renren" data-cmd="renren"></a><a href="#" class="bds_weixin" data-cmd="weixin"></a></div><script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script></div>

     6:全局搜索(whoose);

在Django中使用Whoosh搜索需要使用django-haystack模块。首先需要安装django-haystack和Whoosh,可以使用pip install django-haystack Whoosh命令进行安装。安装完成后,需要在settings.py文件中进行配置,包括搜索引擎的类型、路径等信息。接着需要定义搜索的模型,即在哪些模型中进行搜索。最后需要定义搜索视图和模板,即搜索结果的展示方式。具体的使用方法可以参考django-haystack的官方文档

  • 项目部分代码:

  1. 分页:
    def queryAll(request, num=1):num = int(num)postList = Post.objects.all().order_by('-created')# 创建分页器对象pageObj = Paginator(postList, 2)# 获取当前页的数据perPageList = pageObj.page(num)# 生成页码数列表# 每页开始页码begin = (num - int(math.ceil(10.0 / 2)))if begin < 1:begin = 1# 每页结束页码end = begin + 9if end > pageObj.num_pages:end = pageObj.num_pagesif end <= 10:begin = 1else:begin = end - 9pageList = range(begin, end + 1)return render(request, 'index.html', {'postList': perPageList, 'pageList': pageList, 'currentNum': num})

  2. 全局搜索:
    #coding=UTF-8
    from  haystack import indexes
    from post.models import *
    import sys  # 导入sys模块
    sys.setrecursionlimit(3000)  # 将默认的递归深度修改为3000
    #注意格式(模型类名+Index)
    class PostIndex(indexes.SearchIndex,indexes.Indexable):text = indexes.CharField(document=True, use_template=True)#给title,content设置索引title = indexes.NgramField(model_attr='title')content = indexes.NgramField(model_attr='content')def get_model(self):return Postdef index_queryset(self, using=None):return self.get_model().objects.order_by('-created')

    tokenizer.py

    #coding=utf-8
    import jieba
    from whoosh.analysis import Tokenizer, Token
    class ChineseTokenizer(Tokenizer):def __call__(self, value, positions=False, chars=False,keeporiginal=False, removestops=True,start_pos=0, start_char=0, mode='', **kwargs):t = Token(positions, chars, removestops=removestops, mode=mode,**kwargs)seglist = jieba.cut(value, cut_all=False)  # (精确模式)使用结巴分词库进行分词# seglist = jieba.cut_for_search(value)  #(搜索引擎模式) 使用结巴分词库进行分词for w in seglist:# print wt.original = t.text = wt.boost = 1.0if positions:t.pos = start_pos + value.find(w)if chars:t.startchar = start_char + value.find(w)t.endchar = start_char + value.find(w) + len(w)yield t  # 通过生成器返回每个分词的结果tokendef ChineseAnalyzer():return ChineseTokenizer()

  • 项目部分截图

  • 结语:

写的有点急,具体内容没有详细写出来,只是简单提了一下,如Pagintor分页的使用以及whoose全局搜索使用等,下次有时间在针对具体技术讲解,这个小项目当时写出来也就是用来回顾一下django的相关技术内容的,写的不好,在此致歉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】第10节:结构型模式之“组合模式”

一、简介 组合模式&#xff1a;将一组对象组织成树形结构&#xff0c;将单个对象和组合对象都看做树中的节点&#xff0c;以统一处理逻辑&#xff0c;并且它利用树形结构的特点&#xff0c;递归地处理每个子树&#xff0c;依次简化代码实现。使用组合模式的前提在于&#xff0…

ts 简易封装 axios,统一 API

文章目录 为什么要封装目标文件结构封装通用请求方法获得类型提示http 方法文件上传使用示例实例化post 请求类型提示文件上传 总结完整代码&#xff1a; 为什么要封装 axios 本身已经很好用了&#xff0c;看似多次一举的封装则是为了让 axios 与项目解耦。比如想要将网络请求…

【广州华锐互动】风景区规划VR虚拟现实教学系统

风景区规划VR虚拟现实教学系统是一种新兴的教学工具&#xff0c;它可以通过虚拟现实技术&#xff0c;为学生提供一种沉浸式的、实时的、全方位的景区规划体验。 在风景区规划VR虚拟现实教学系统中&#xff0c;学生可以通过虚拟现实技术&#xff0c;实时地与景区进行交互。他们可…

Spring - 手写模拟Spring底层原理

手写Spring 定义配置类AppConfig ComponentScan("com.spring.zsj") public class AppConfig {Beanpublic ApplicationListener applicationListener() {return new ApplicationListener() {Overridepublic void onApplicationEvent(ApplicationEvent event) {System…

【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件

文章目录 1.MenuStrip2.ContextMenuStrip3.ToolStrip4.StatusStrip 1.MenuStrip MenuStrip作为一个容器可以包含多个菜单项。MenuStrip 的重要属性包括&#xff1a; Name&#xff1a;菜单的名字Dock&#xff1a;菜单的停靠位置Items&#xff1a;菜单项的集合 ToolStripMenuI…

前端接口请求支持内容缓存和过期时间

前端接口请求支持内容缓存和过期时间 支持用户自定义缓存时间&#xff0c;在规则时间内读取缓存内容&#xff0c;超出时间后重新请求接口 首先封装一下 axios&#xff0c;这一步可做可不做。但是在实际开发场景中都会对 axios 做二次封装&#xff0c;我们在二次封装的 axios …

vue3中解析地址(address-parse插件的使用)

1.安装 npm install address-parse --save 2.使用 // 引入address-parse import AddressParse, { AREA, Utils } from "address-parse";const adressValue ref([])const getResolutionContent () > {const [result] AddressParse.parse(EnterpriseSalesDetai…

JAVA虚拟机-第2章 Java自动内存管理-异常实践

Java堆溢出 堆的参数设置&#xff1a;将堆的最小值-Xms参数与最大值-Xmx参数设置 public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list new ArrayList<OOMObject>();while (true) {list.add(new OO…

JTS: 13 Polygonizer 多线合成面

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 线段 生成之后的面 public class GeometryPolygonization {private static final GeometryFactory geometryFactory new GeometryFactory();private static final Logger LOGGER …

陪诊系统|挂号陪护搭建二开陪诊师入驻就医小程序

我们的陪诊小程序拥有丰富多样的功能&#xff0c;旨在最大程度满足现代人的需求。首先&#xff0c;我们采用了智能排队系统&#xff0c;通过扫描二维码获取排号信息&#xff0c;让您从繁琐的排队过程中解放出来。其次&#xff0c;我们提供了多种支付方式&#xff0c;不仅可以实…

管理类联考——数学——汇总篇——知识点突破——代数——函数、方程——记忆

文章目录 考点记忆/考点汇总——按大纲 整体局部 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式&#xff0c;收集/汇总考点&#xff0c;即需记忆点&#xff0c;在通过整体的记忆法&#xff0c;比如整体信息很多&#xff0c;通常…

python线程(进程子单位)

进程是由CPU给分配的执行单元&#xff0c;比较消耗空间和内存 创建、使用线程 import threading# 进程 # 线程 from time import sleepdef download():list1 ["girl.png", "boy.png", "child.png"]for l in list1:print(l)sleep(1.5)print(&qu…

变量的作用域

在javascript中&#xff0c;var定义的变量实际是有作用域的。 1 假设在函数体内声明&#xff0c;但在函数体外不可以使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </…

Java实验一编程环境使用

1&#xff0e;String类的常用方法&#xff08;StringExample.java&#xff09; package step1;public class StringExample {public static void main(String args[]) {String s1 new String("you are a student");String s2 new String("how are you")…

Lodash 真的死了吗?Lodash 5 在哪里?

与一些传言相反&#xff0c;Lodash依然活跃&#xff0c;并正在迈向Lodash 5的发布&#xff01; Lodash 是那些为 JavaScript 提供便利功能的实用程序库之一&#xff0c;它使编程变得更加轻松。许多开发者使用它来简化对象和数组的处理。 它也是一个像 Moment.js那样被捕获得措手…

038-第三代软件开发-简易视频播放器-自定义Slider (二)

第三代软件开发-简易视频播放器-自定义Slider (二) 文章目录 第三代软件开发-简易视频播放器-自定义Slider (二)项目介绍简易视频播放器自定义Slider (二)横向纵向 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&…

【UE】从UI中拖拽生成物体

目录 效果 步骤 一、准备工作 二、创建UI 三、创建Actor 四、拖拽生成Actor的逻辑 效果 步骤 一、准备工作 1. 首先新建一个第三人称模板工程 2. 新建一个游戏模式基础&#xff0c;这里命名为“BP_UIGameMode” 在世界场景设置中设置游戏模式覆盖为“BP_UIGameMode”…

Vue中切换tab路由,提示this.$confirm确定和取消执行不同的逻辑

beforeRouteLeave (to, from, next) { // 离开页面 if (this.editFlag true) { this.$confirm(页面尚未保存&#xff0c;确认离开吗?, 提示, { distinguishCancelAndClose: true, // 区分取消和关闭 confirmButtonText: 确定, cancelButtonText: 取消, type: info }).then(()…

RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

1. 在ENV中添加组件 2. 下载组件 3. 生成代码 4. 打开代码 双击project.vcxproj 编译 5. 运行

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是不可或缺的工具。然而&#xff0c;它的便利性和安全性有时会因常见的问题而受到损害&#xff1a;冻结 SSH 会话。 此外&#xff0c;session 的突然中断可能会导致工作丢失、项目延迟和无…