首页 > 其他分享 >Django博客开发教程:实现网站首页

Django博客开发教程:实现网站首页

时间:2023-08-09 11:36:29浏览次数:33  
标签:index 教程 request Django html 首页 context 文章

实现首页模板前,我们先把共公的页面模板base.html调用好。首先我们先看导航部分,除开首页和关于博主之外,其它的其实是我们的文章分类名。如图:

2.jpg

我们只需要在首页视图函数里,查询出所有的文章分类名称,然后在模板页面上展示就行。

blog/views.py

from .models import Category
#从models里导入Category类
def index(request):
    allcategory = Category.objects.all()#通过Category表查出所有分类
    #把查询出来的分类封装到上下文里
    context = {
            'allcategory': allcategory,
        }
    return render(request, 'index.html', context)#把上下文传到index.html页面

打开base.html页面,我们找到导航代码:

templates/base.html

<nav class="nav fl">
    <ul id="fix-list" class="fix-list clearfix">
        <li id="menu-item-24086" class="menu-item"><a href="/">首页</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-1.html">Django</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-2.html">Python</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-3.html">Linux</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-4.html">Mysql</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-5.html">运维知识</a></li>
        <li id="menu-item-117720" class="menu-item">
            <a href="/list-6.html">我的日记</a></li>
        <li id="menu-item-24086" class="menu-item"><a href="/about/">关于博主</a></li>
    </ul>
</nav>

里面的<li></li>标签只留下首页和关于博主的:

<nav class="nav fl">
    <ul id="fix-list" class="fix-list clearfix">
        <li id="menu-item-117720" class="menu-item"><a href="/">首页</a></li>
        
        <li id="menu-item-117720" class="menu-item"><a href="/about/">关于博主</a></li>
    </ul>
</nav>

然后中间部分加入如下代码:

{% for category in allcategory %}
<li id="menu-item-117720" class="menu-item">
 <a href="{% url 'index' %}list-{{ category.id }}.html">{{ category.name }}</a>
 </li>
{% endfor %}

最终代码:

templates/base.html

<nav class="nav fl">
    <ul id="fix-list" class="fix-list clearfix">
        <li id="menu-item-117720" class="menu-item"><a href="/">首页</a></li>
        
        {% for category in allcategory %}
         <li id="menu-item-117720" class="menu-item">
         <a href="{% url 'index' %}list-{{ category.id }}.html">{{ category.name }}</a>
         </li>
        {% endfor %}
        
        <li id="menu-item-117720" class="menu-item"><a href="/about/">关于博主</a></li>
    </ul>
</nav>

代码里面我们通过下面的代码遍历输出变量的内容:

{% for category in allcategory %}

文章分类名我们通过下面的代码可得到:

{{ category.name }}

点击文章分类名,就是进入到各个文章分类的列表页面,结合myblog/urls.py里的列表页面URL list-<int:lid>.html是由list-和分类ID组成,所以完整的URL是:

网站首页(网站域名)/list-分类ID.html

在模板页面调用url别名的代码是:

{% url 'xxx' %}  #xxx为别名 网站首页就是{% url 'index' %}

分类ID通过下面的代码可得到:

{{ category.id }}

为什么可以通过这样的方式可以查到分类ID,之前的文章有提到:体验数据查询

最后得到完整的列表URL代码如下:

{% url 'index' %}list-{{ category.id }}.html

弄好之后,然后我们刷新页面就能看到效果。

首页幻灯图的实现

实现前,要先添加一些数据。然后在首页视图函数里查询出所有的幻灯图的数据:

blog/views.py

from blog.models import Category, Banner
#把Banner表导入
def index(request):
    allcategory = Category.objects.all()
    banner = Banner.objects.filter(is_active=True)[0:4]#查询所有幻灯图数据,并进行切片
    context = {
                'allcategory': allcategory,
                'banner':banner, #把查询到的幻灯图数据封装到上下文
        }
    return render(request, 'index.html', context)

提示:我们通过filrter查询出所有激活的is_active幻灯图数据,并进行切片,只显示4条数据。

首页index.html文件里,找到幻灯图代码,里面的<li></li>标签只保留一个,然后修改成如下代码“

templates/index.html

{% for b in banner %}
<li class="slide fix-width">
    <a href="{{ b.link_url }}" title="{{ b.text_info }}">
    <img src="{% url 'index' %}media/{{ b.img }}" srcset="{% url 'index' %}media/{{ b.img }}" alt="{{ b.text_info }}"
                 class="wp-post-image" width="370" height="290"/></a>
        <span class="text ani-left"><strong>{{ b.text_info }}</strong></span>
    </li>
{% endfor %}

其中{{ b.link_url }}表示图片链接的URL,{{ b.text_info }}为图片的标题描述,{{ b.img }}为上传的图片名,完整的图片路径由{% url 'index' %}media/{{ b.img }}组成。media/就是我们之前设置的图片上传的目录。

首页推荐阅读实现

我们在发布文章的时候,要先在推荐位里选择好要推荐的文章,然后再进行查询展现。

3.jpg

首页视图函数里:

blog/views.py
from blog.models import Category,Banner, Article
#我们查询的是进行推荐的文章,所以要导入文章Article表
def index(request):
    ....
    tui = Article.objects.filter(tui__id=1)[:3]#查询推荐位ID为1的文章
    context = {
            ...
            'tui':tui,
        }
    return render(request, 'index.html', context)

提示:filter查询条件里的tui__id=1,表示为通过文章里的外键推荐位进行筛选。

首页index.html页面,找到推荐阅读里面三个结构相同的代码,保留一个,然后修改成:

templates/index.html

{% for t in tui %}
<div class="caption">
    <h4><a href="{% url 'index' %}show-{{ t.id }}.html" title="{{ t.title }}"
               rel="bookmark">{{ t.title }}</a></h4>
    <p>{{ t.excerpt|truncatechars:"80" }}</p>
    </div>
{% endfor %}

里面要留意的是文章的URL的构成,这和列表URL一样,这里不重复,{{ t.excerpt|truncatechars:"80" }}这个代码表示截取文章摘要的80个字符。

首页最新文章实现

首页最新文章,调用的是所有分类里的最新文章,这里只调用10篇:

blog/views.py

def index(request):
    ...
    allarticle = Article.objects.all().order_by('-id')[0:10]
    context = {
        ...
        'allarticle': allarticle,
        }
    return render(request, 'index.html', context)

里面的.order_by('-id')为数据排序方式,[0:10]为只获取10索引切片,只获取最新的10篇文章。

首页最新文章的,只保留一个文章展示代码,然后修改为:

templates/index.html

{% for a in allarticle %}
    <div class="article-box clearfix excerpt-1">
        <div class="col-md-4">
            <div class="thumbnail">
                <a href="{% url 'index' %}show-{{ a.id }}.html" title="{{ a.title }}">
                    <img src="media/{{ a.img }}"
                         srcset="media/{{ a.img }}"
                         alt="{{ a.title }}" class="wp-post-image" width="240" height="160"/></a>
            </div>
        </div>
        <div class="col-md-8">
            <h2><a href="{% url 'index' %}show-{{ a.id }}.html" target="_blank"
                   title="{{ a.title }}">{{ a.title }}</a></h2>
            <p class="txtcont hidden-xs"><a href="{% url 'index' %}show-{{ a.id }}.html" target="_blank"
                                            title="{{ a.title }}">{{ a.excerpt }}</a></p>
            <div class="meta"><span class="label label-info"><a
                    href="{% url 'index' %}list-{{ a.category.id }}.html">{{ a.category.name }}</a></span>
                <time class="item"><i class="fa fa-clock-o"></i>{{ a.created_time|date:"Y年m月d日" }}
                </time>
            </div>
        </div>
    </div>
{% endfor %}

提示:里面分类名和分类ID是文章里的外键字段,所以我们是通过代码{{ a.category.name }}和{{ a.category.id}}这样的方式进行调用的。时间字段我们进行格式化,然后通过年月日的形式展现,{{ a.created_time|date:"Y年m月d日" }}。

热门文章排行实现

热门文章的实现有多种方式,如果你想要在上面展示自己指定的文章,你可以在后台通过再添加一个推荐位来实现,也可以查询所有文章,通过文章浏览数进行倒序展示,也可以查询数据库通过随机的方式展示。代码分别如下:

blog/views.py

def index(request):
    ...
    #hot = Article.objects.all().order_by('?')[:10]#随机推荐
    #hot = Article.objects.filter(tui__id=3)[:10]   #通过推荐进行查询,以推荐ID是3为例
    hot = Article.objects.all().order_by('views')[:10]#通过浏览数进行排序
    context = {
               ... 
          'hot':hot,
        }
    return render(request, 'index.html', context)

热门文章推荐代码里,<ol></ol>标志对里,找到<li></li>标签,只保留一个,然后修改成如下代码:

templates/index.html

{% for h in hot %}
<li><a href="{% url 'index' %}show-{{ h.id }}.html" title="{{ h.title }}">{{ h.title }}</a></li>
{% endfor %}

右侧热门推荐实现

打侧的热门推荐代码在right.html里,所以我们需要修改right.html页面,这个地方我们是通过后台的推荐位ID为2实现的,我们在发文章的时候,进行推荐就可以了。查询代码:

blog/views.py

def index(request):
    ...
    remen = Article.objects.filter(tui__id=2)[:6]
    context = {
            ...
            'remen':remen,
        }
    return render(request, 'index.html', context)

打开right.html页面,修改对应代码:

templates/right.html

<ul class="post-hot clearfix">
{% for k in remen %}
    <li>
        <div class="img">
        <a href="{% url 'index' %}show-{{ k.id }}.html" title="{{ k.title }}">
        <img src="{% url 'index' %}media/{{ k.img }}"
         srcset="{% url 'index' %}media/{{ k.img }}" alt="{{ k.title }}" 
            class="wp-post-image" width="120" height="80"/>
        </a>
        </div>
        <div class="text">
        <a href="{% url 'index' %}show-{{ k.id }}.html" title="{{ k.title }}"
                   target="_blank">{{ k.title }}</a>
        </div>
       </li>
{% endfor %}
</ul>

右侧所有标签实现

blog/views.py

from blog.models import Category,Banner, Article, Tag
#导入标签表
def index(request):
    ...
    tags = Tag.objects.all()
    context = {
            ...
            'tags':tags,
        }
    return render(request, 'index.html', context)

找到标签代码,修改为:

templates/right.html

<div class="tags">
    {% for tag in tags %}
        <a href="{% url 'index' %}tag/{{ tag.name }}">{{ tag.name }}</a>
    {% endfor %}
</div>

右侧的二维码图片就简单了,我们修改一下路径就行。留意,加之前我们要在right.html头部加入{% load staticfiles %}:

templates/right.html

{% load staticfiles %}
#上面的代码要加在第一行

<img src="static/picture/weixinqr.jpg" alt="微信二维码" width="160" height="160">
修改为:
<img src="{% static "picture/weixinqr.jpg" %}" alt="微信二维码" width="160" height="160">

尾部的友情链接实现:

blog/views.py
from blog.models import Category,Banner, Article, Tag, Link
#导入友情链接表Link

def index(request):
    ...
    link = Link.objects.all()
    context = {
            ...
            'link':link,
        }
    return render(request, 'index.html', context)

找到友情链接代码,修改为:

templates/index.html

<ul class="clears">
    {% for l in link %}
        <li><a href="{{ l.linkurl }}" target="_blank">{{ l.name }}</a></li>
    {% endfor %}
</ul>

全部修改好之后,刷新页面,就能看到效果

标签:index,教程,request,Django,html,首页,context,文章
From: https://www.cnblogs.com/yoloooo/p/17616369.html

相关文章

  • 微信支付 V3 开发教程:初识 Senparc.Weixin.TenPayV3
    前言我在9年前发布了 Senparc.WeixinSDK 第一个开源版本,一直维护至今,如今Stras已经破7K,这一路上得到了.NET社区的积极响应和支持,也受到了非常多的宝贵建议,甚至代码的PR,目前累计的代码贡献者数量已经超过350人,在此表示衷心的感谢!我们也总在第一时间及时更新微......
  • oobabooga-text-generation-webui可能是最好的语言模型启动器(包含手把手安装教程)
    https://www.bilibili.com/read/cv24006101/引言:问:oobabooga是什么?oobabooga-text-generation-webui是一个用于运行类似Chatglm、RWKV-Raven、Vicuna、MOSS、LLaMA、llama.cpp、GPT-J、Pythia、OPT和GALACTICA等大型语言模型的GradioWeb用户界面。它的目标是成为文本生成的AUT......
  • Python基础day62 DjangoAjax的传输应用
    前后端数据传输的编码格式(contentType)前后端数据传输的请求方式有两种:get、post我们只研究post请求的编码格式三种编码格式urlencodedform-datajson发送post请求的方式form表单Ajaxpostman(第三方工具,需要下载) form表单发送post请求的时候数据的编码格式请求头conten......
  • - 前后端数据传输的编码格式(contentType) - Ajax朝后端提交文件数据 - Ajax朝后端提
    前后端数据传输的编码格式(contentType)前后端数据传输的请求方式有两种:get、post我们只研究post请求的编码格式三种编码格式urlencodedform-datajson发送post请求的方式form表单Ajaxpostman(第三方工具,需要下载) form表单发送post请求的时候数据的编码格式请求头conten......
  • 小程序逆向教程
    热烈欢迎,请直接点击!!!进入博主AppStore主页,下载使用各个作品!!!注:博主将坚持每月上线一个新app!!工具准备下载地址:https://gitee.com/jiangsihan/wechat-applet-reverse-tool包含:逆向工具、解密工具逆向工具目前用的是:wxappUnpacker这个是一个大神开发的,之前可以在github下载,不过截止......
  • MobaXterm工具的下载和安装教程
    MobaXterm工具的下载和安装1、MobaXterm官网下载界面网址:https://mobaxterm.mobatek.net/download.html然后选择左边的家庭版即可:2、选择Portableedition版本(免安装版本)3、等待压缩包下载完成4、双击压缩包里面的这个exe应用程序文件5、软件界面如下所示MobaXterm工......
  • 无涯教程-Perl - getgrnam函数
    描述此功能通过组名查找组文件条目。在列表context中返回以下内容-($name,$passwd,$gid,$members)$members标量包含作为组成员的登录名的空格分隔列表。在标量context中返回组名。有关检索整个组文件的更有效方法,请参阅getgrent。在Windows下,请考虑使用Win32API::Net模块。......
  • Django 的数据库操作
    Djangp提供了一套抽象的API,能够对数据库进行CRUD(create,retrieve,update,deleteobjects)1、使用shell操作安装ipython交互环境pipinstall-ihttps://pypi.douban.com/simpleipythonpyhtonmanage.pyshell-iipython查看所有项目:Projects.objects.......
  • Jmeter(二十六)Jenkins下载安装教程
    什么是Jenkins?它能做什么?Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。更多介绍可自行百度说一下Jenkins的下载安装及一些简单的配置(一般在公司的话不用自己安装,直接访问公司......
  • Django 模型的简单应用
    每一个应用下的数据库模型类,需要在当前应用下的model.py这个文件中定义数据库模型定义规则如下:一个数据库模型类需要继承Model或者Model的子类默认会创建一个自动递增的id主键默认创建的数据库名为,应用名小写_数据库模型类小写一个数据库模型类相当于......