首页 > 其他分享 >Django博客开发教程:单页面实现与代码优化

Django博客开发教程:单页面实现与代码优化

时间:2023-08-16 14:24:03浏览次数:46  
标签:paginator 教程 list request Django 代码优化 objects Article page

单页面的URL是:网站域名/about/,由于单页面里面的东西比较少,我们就只查询一下分类表获取所有文章分类即可。视图函数代码:

blog/views.py

# 关于我们
def about(request):
    allcategory = Category.objects.all()
    return render(request, 'page.html',locals())

打开page.html页面,把里面的内容修改为自己想的要内容。把右边的二维码修改一下:

templates/page.html

<img src="{% url 'index' %}static/picture/weixinqr.jpg" width="160" height="160">

至此,所有页面都实现完成。

下面我们需要进行小范围的代码优化。大家仔细观察一下,可以看到,我们每个视图函数里都有重复的查询语句。我们访问一次就得查询一次,那我们有没有方法,能让它只查询一次呢?答案是肯定的,我们先把重复的语句提取出来,单独放到一个函数里去。然后把这个函数添加到全局变量。这样,我们只需要查询一次就能实现所有视图函数都能获取到查询的数据。我们查看到,重复的有下面这几句:

blog/views.py

allcategory = Category.objects.all()
remen = Article.objects.filter(tui__id=2)[:6]
tags = Tag.objects.all()

我们把这几句单独提取出来,单独放到另一个函数里:

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,在里面添加代码:

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里,打首页视图函数修改成:

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())

然后在所有的视图函数里,把有有这三句代码的全删除:

allcategory = Category.objects.all()
remen = Article.objects.filter(tui__id=2)[:6]
tags = Tag.objects.all()

最后得到的完整的视图函数代码如下:

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哈哈~

标签:paginator,教程,list,request,Django,代码优化,objects,Article,page
From: https://www.cnblogs.com/yoloooo/p/17633898.html

相关文章

  • Django博客开发教程:实现文章内容页
    文章内容的URL是:网站域名/show-文章ID.html,文章ID是通过URL里的sid传进来的。视图函数代码:blog/views.pydef show(request,sid):    show = Article.objects.get(id=sid)#查询指定ID的文章    allcategory = Category.objects.all()#导航上的分类    tags......
  • Django博客开发教程:实现搜索页面
    搜索列表页的URL是:网站域名/s/搜索关键词,搜索页面,同样我们直接复制一份list.html页面,然后更名为search.html。视图函数代码:def search(request):    ss=request.GET.get('search')#获取搜索的关键词    list = Article.objects.filter(title__icontains=ss)#获取......
  • Django博客开发教程:实现标签页面
    标签列表是的URL是:网站域名/tag/标签名,标签名是URL里的<tag>传进来的。标签页面和列表页面展现样式是一样的,前面我们也提及过,所以我们直接复制list.html页面,然后更名为tags.html。视图函数代码:blog/views.pydef tag(request, tag):    list = Article.objects.filter......
  • Django博客开发教程:实现文章列表
    文章列表的URL是:网站域名/list-分类ID.html,文章列表页面需要调用的地方相对首页就少了很多。我这边就不再像首页那样做详细解释了。直接上视图函数代码:blog/views.py#文章列表def list(request,lid):    list = Article.objects.filter(category_id=lid)#获取通过URL......
  • 无涯教程-Perl - sleep函数
    描述此函数将脚本暂停EXPR秒,如果未指定EXPR,则暂停脚本。返回实际睡眠的秒数。可以被信号处理程序打断,但是您应该避免使用带Alert的睡眠,因为许多系统将Alert用于睡眠实现。语法以下是此函数的简单语法-sleepEXPRsleep返回值此函数返回整数,实际睡眠的秒数例以下......
  • kubeadm 部署的集群升级教程
    1、确定升级的集群版本,查看现有的集群版本kubectl getnodes2、执行如下命令确定升级的版本,目标版本是v1.27.4yumlist--showduplicateskubeadm--disableexcludes=kubernetes3、升级master节点,所有master节点都要操作,并升级完验证版本yuminstall-ykubeadm-1.27.4-0-......
  • 无涯教程-Perl - sin函数
    描述此函数返回EXPR的正弦值;如果未指定,则返回$_。此函数始终返回浮点数。语法以下是此函数的简单语法-sinEXPRsin返回值此函数返回EXPR的浮点正弦值例以下是显示其基本用法的示例代码-#!/usr/bin/perl$temp=sin(4);print"sinvalueof4is$temp";执行上......
  • IDEA 2023.2 最新安装使用教程(附激活码,亲测好用)
    申明:本教程IntelliJIDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!PS:本教程最新更新时间:2023年7月28日,持续更新,收藏防失联哟说明本教程适用于JetBrains全系列产品,包括IDEA、Pycharm、WebStorm、Phpstorm、Da......
  • 客服系统搭建教程,这些技巧你必须掌握!
    随着企业对客户服务需求的不断增加,客服系统的搭建成为了一项重要的任务。一个高效、稳定的客服系统能够提升客户满意度,增强企业竞争力。那么,在搭建客服系统时,有哪些技能是我们必须掌握的呢?了解客户需求在搭建客服系统之前,我们需要深入了解客户的需求,包括客户群体、服务内容、......
  • 嵌入式教程_DSP教学实验箱:2-9 VGA显示实验
    实验目的本节视频的目的是了解VGA接口的功能和使用,掌握VGA显示的原理并实现VGA显示图像数据。实验原理底板原理图控制VGA的管脚是VPIF总线,和控制LCD显示的管脚是复用的VGA(VideoGraphicsArray)VGA是视频图形阵列,是一种使用模拟信号进行视频传输的标准协议,由IBM公司于1987年推出,因其......