小酌Django5——博客内容展示

小酌Django5——博客内容展示

文章内容展示

我们已经实现了一个展示标题列表的页面,现在看看如何实现点击标题查看文章详情内容:

增加超链接

修改文章列表页的li,增加超链接:

<li><a href="{{ blog.id }}">{{ blog.title }}</a></li>

点击某一个超链接:我们发现浏览器跳转的URL变成了http://127.0.0.1:8000/blog/5;

编写视图函数

获取id为5的article:

  • 导入BlogArticles:from blog.models import BlogArticles
  • 查询:article = BlogArticles.objects.get(id=1)

知道了如何获取指定id的article对象,现在先编辑blog/views.py,增加响应查看文章详情的请求函数blog_article:

def blog_article(request, article_id):
    article = BlogArticles.objects.get(id=article_id)
    pub = article.publish
    return render(request, "blog/content.html", {"article": article, "publish": pub})

创建匹配模板

创建与之对应的模板:blog/template/blog/content.html

{% extends "base.html" %}

{% block title %}
blog article
{% endblock %}

{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>{{article.title}}</h1>
</div>
<div class="row">
    <div class="col-xs-12 col-md-8">
        <p class="text-center">
            <span>{{article.author.username}}</span>
            <span style="margin-left: 20px;">{{publish}}</span>
            <div>{{article.body}}</div>
        </p>
    </div>
    <div class="col-xs-6 col-md-4">
        <h2>广告</h2>
        <p>读书笔记</p>
        <img width="200px"
            src="https://i0.hdslb.com/bfs/face/a0d8a470a7b7b1175c9cc43a88ee4adcd9a97851.jpg@68w_68h.webp">
    </div>
</div>
{% endblock %}

配置URL

  • blog/urls.py文件中增加新的URL路径;
from django.conf.urls import url
from . import views

urlpatterns = [
    # r"^$" :表示访问当前应用的根目录,对应:http://127.0.0.1:8000/blog/
    # views.blog_title :声明了响应这个请求的函数对象
    url(r"^$", views.blog_title, name="blog_title"),
    url(
        r"(?P<article_id>\d)/$", views.blog_article, name="blog_detail"
    ),  # 可以取到列表超链接赋的id值
]

一切完整,运行项目:
在这里插入图片描述
在这里插入图片描述

访问不存在的文章内容

如果修改访问url为http://127.0.0.1:8000/blog/6,浏览器会显示十分详尽的错误信息:

DoesNotExist at /blog/6/
BlogArticles matching query does not exist.
...

这是因为目前在Debug模式下,错误信息会尽可能的详尽,便于调试;

异常处理

  • 为避免该错误,应在响应此请求的函数中对这种异常进行处理:
  • 修改blog/views.py中的blog_article()函数;
from django.shortcuts import render, get_object_or_404

# Create your views here.

from .models import BlogArticles


def blog_title(request):
    blogs = BlogArticles.objects.all()
    return render(request, "blog/titles.html", {"blogs": blogs})


def blog_article(request, article_id):
    # article = BlogArticles.objects.get(id=article_id)
    article = get_object_or_404(BlogArticles, id=article_id)
    pub = article.publish
    return render(request, "blog/content.html", {"article": article, "publish": pub})

再访问id=6的url页面,会显示404页面:

Page not found (404)
Request Method:	GET
Request URL:	http://127.0.0.1:8000/blog/6/
Raised by:	blog.views.blog_article

get_object_or_404()方法

  • 该方法能简化对请求页面不存在时的异常处理;
  • 若对象不存在,会抛出DoesNoteExist异常;
  • 该异常可通过try…except捕获,在except中可使用raise Http404()来处理;
  • 参数列表:get_object_or_404(kclass, *args, **kwargs)
    • klass:一般是数据模型中的一个类(Model类);
    • 另外两个是查询时的条件参数;

类似的Django中海油很对的默认方法,可以帮助提高开发效率,减少代码量;

小结:

至此,我们完成了一个网站开发的最基础结构:博客应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值