Django博客开发教程:单页面实现与代码优化
1.1、Django博客开发教程:开发前的准备2.2、Django博客开发教程:项目需求分析3.Django博客开发教程:数据库设计分析4.Django博客开发教程:创建项目5.Django博客开发教程:基础配置6.Django博客开发教程:欢迎页面7.Django博客开发教程:创建数据库模型8.Django博客开发教程:用Admin管理后台管理数据9.Django博客开发教程:使用富文本编辑器添加数据10.Django博客开发教程:使用ckeditor富文本编辑器添加数据11.Django博客开发教程:URL与视图函数12.Django博客开发教程:体验django模板,13.Django博客开发教程:体验数据查询14.Django博客开发教程:一些常用的模板使用方法15.Django博客开发教程:实现模板之前的分析与准备16.Django博客开发教程:实现网站首页17.Django博客开发教程:实现文章列表18.Django博客开发教程:实现文章内容页19.Django博客开发教程:实现标签页面20.Django博客开发教程:实现搜索页面
21.Django博客开发教程:单页面实现与代码优化
单页面的URL是:网站域名/about/,由于单页面里面的东西比较少,我们就只查询一下分类表获取所有文章分类即可。视图函数代码:
1 2 3 4 5 6 | blog /views .py # 关于我们 def about(request): allcategory = Category.objects.all() return render(request, 'page.html' ,locals()) |
打开page.html页面,把里面的内容修改为自己想的要内容。把右边的二维码修改一下:
1 2 3 | templates /page .html <img src= "{% url 'index' %}static/picture/weixinqr.jpg" width= "160" height= "160" > |
至此,所有页面都实现完成。
下面我们需要进行小范围的代码优化。大家仔细观察一下,可以看到,我们每个视图函数里都有重复的查询语句。我们访问一次就得查询一次,那我们有没有方法,能让它只查询一次呢?答案是肯定的,我们先把重复的语句提取出来,单独放到一个函数里去。然后把这个函数添加到全局变量。这样,我们只需要查询一次就能实现所有视图函数都能获取到查询的数据。我们查看到,重复的有下面这几句:
1 2 3 4 5 | blog /views .py allcategory = Category.objects.all() remen = Article.objects.filter(tui__id=2)[:6] tags = Tag.objects.all() |
我们把这几句单独提取出来,单独放到另一个函数里:
1 2 3 4 5 6 7 | blog /views .py def global_variable(request): allcategory = Category.objects.all() remen = Article.objects.filter(tui__id=2)[:6] tags = Tag.objects.all() return locals() |
然后打开myblog/settings.py,找到TEMPLATES,在里面添加代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | myblog /settings .py TEMPLATES = [ { 'BACKEND' : 'django.template.backends.django.DjangoTemplates' , 'DIRS' : [os.path. join (BASE_DIR, 'templates' )] , 'APP_DIRS' : True, 'OPTIONS' : { 'context_processors' : [ 'django.template.context_processors.debug' , 'django.template.context_processors.request' , 'django.contrib.auth.context_processors.auth' , 'django.contrib.messages.context_processors.messages' , 'blog.views.global_variable' , #添加此处 ], }, }, ] |
然后在blog/views.py里,打首页视图函数修改成:
1 2 3 4 5 6 7 8 | blog /views .py def index(request): banner = Banner.objects.filter(is_active=True)[0:4] tui = Article.objects.filter(tui__id=1)[:3] allarticle = Article.objects.all().order_by( '-id' )[0:10] hot = Article.objects.all().order_by( 'views' )[:10] link = Link.objects.all() return render(request, 'index.html' , locals()) |
然后在所有的视图函数里,把有有这三句代码的全删除:
1 2 3 | allcategory = Category.objects.all() remen = Article.objects.filter(tui__id=2)[:6] tags = Tag.objects.all() |
最后得到的完整的视图函数代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | blog /views .py from django.shortcuts import render from blog.models import Category,Banner, Article, Tag, Link from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def global_variable(request): allcategory = Category.objects.all() remen = Article.objects.filter(tui__id=2)[:6] tags = Tag.objects.all() return locals() #首页 def index(request): banner = Banner.objects.filter(is_active=True)[0:4] tui = Article.objects.filter(tui__id=1)[:3] allarticle = Article.objects.all().order_by( '-id' )[0:10] hot = Article.objects.all().order_by( 'views' )[:10] link = Link.objects.all() return render(request, 'index.html' , locals()) #列表页 def list(request,lid): list = Article.objects.filter(category_id=lid) cname = Category.objects.get( id =lid) page = request.GET.get( 'page' ) paginator = Paginator(list, 5) try: list = paginator.page(page) #获取当前页码的记录 except PageNotAnInteger: list = paginator.page(1) #如果用户输入的页码不是整数时,显示第1页的内容 except EmptyPage: list = paginator.page(paginator.num_pages) #如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 return render(request, 'list.html' , locals()) #内容页 def show(request,sid): show = Article.objects.get( id =sid) hot = Article.objects.all().order_by( '?' )[:10] previous_blog = Article.objects.filter(created_time__gt=show.created_time,category=show.category. id ).first() netx_blog = Article.objects.filter(created_time__lt=show.created_time,category=show.category. id ).last() show.views = show.views + 1 show.save() return render(request, 'show.html' , locals()) #标签页 def tag(request, tag): list = Article.objects.filter(tags__name=tag) tname = Tag.objects.get(name=tag) page = request.GET.get( 'page' ) paginator = Paginator(list, 5) try: list = paginator.page(page) # 获取当前页码的记录 except PageNotAnInteger: list = paginator.page(1) # 如果用户输入的页码不是整数时,显示第1页的内容 except EmptyPage: list = paginator.page(paginator.num_pages) # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 return render(request, 'tags.html' , locals()) # 搜索页 def search(request): ss=request.GET.get( 'search' ) list = Article.objects.filter(title__contains=ss) page = request.GET.get( 'page' ) paginator = Paginator(list, 10) try: list = paginator.page(page) # 获取当前页码的记录 except PageNotAnInteger: list = paginator.page(1) # 如果用户输入的页码不是整数时,显示第1页的内容 except EmptyPage: list = paginator.page(paginator.num_pages) # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 return render(request, 'search.html' , locals()) # 关于我们 def about(request): return render(request, 'page.html' ,locals()) |
至此,我们所有的页面都已经完成。之后就是上线部署了。
关于项目部署,请查看文章下面的文章:
CentOS7下部署Django项目详细操作步骤
Windows server iis部署Django详细操作
Ubuntu部署Django项目方法详解
如果还有什么疑问,大家可以留言交流。完整的项源码我先不放出,自己动手实现一遍,这样才能达到学习的目的。如果实在弄不出来了,那就加我的微信:VIPdjango,获取源码。加我的时候,请发送验证"源码"。
================================================================================
如果有同学走到了这一步,恭喜你网站快要成功了,但你应该需要源码来对比自己的代码,除了联系原作者,也可以联系本人微信xoyo2371,私信给你。O(∩_∩)O哈哈~
合集:
Django博客开发教程
分类:
开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理