『Django』搭建你的博客网站

news2024/11/12 16:44:15

theme: smartblue

点赞 + 关注 + 收藏 = 学会了

本文简介

如果你学了我前面写的 Django 文章,现在已经有能力去试试自己搭建博客网站了。

虽然用的不是现在流行的前后端分离的方式(前后端分离的方式会在之后的文章讲解)。

但在搭建网站之前我们还要做一些额外的功能让你的博客内容更丰富。

比如在写博客时会给文章内容配图,会给重点内容的文本加粗或者进行高亮处理。

这就需要用到富文本编辑器了。

本文把 Django 入门阶段的最后一块拼图补全。

本文的代码比之前的 Django 文章要多,需要有点耐心,最好跟着敲一遍。

读取数据库的内容,并展示在前台页面中

前面的文章已经介绍了怎么读写数据库,怎么将设置路由,怎么让页面动态加载内容。

我们先把这些知识点串起来,先实现一个简单的页面。将 article 这个表的数据加载到网页中展示出来。

前面我们已经将 Django 自带的后台配置起来了,现在使用这个后台添加多几篇文章。

由于前面我们将 article 表的 id 设置为不可修改,所以在模型文件中需要将这个 id 设置为自增( models.AutoField )才行,不然无法增加文章。

```python

blog/models.py

省略部分代码

class Article(models.Model): id = models.AutoField(primary_key=True) ```

然后再重新执行数据库迁移命令。

python manage.py makemigrations
python manage.py migrate

接着就在后台开心创建文章吧。

01.png

在调整完模型并创建好文章后,接下来就要将后台编写好的这些文章放到前台展示了。

所谓的前台就是我们前面讲应用和路由时提到的内容。比如在 http://127.0.0.1:8000/blog/ 这个地址访问博客列表,在 http://127.0.0.1:8000/blog/article/<str:id>/ 这个地址后面拼上博客 id 去访问对应文章的详情。

先看看效果。

02.gif

本专栏重点讲 Django ,偏后端的内容,所以页面样式我没写得很复杂(我懒)。

要实现这个功能需要走以下流程。

03.png

路由、视图、模型之间的关系大概如上图所示。

第一步先配好路由,打开项目的 urls.py ,在路由部分写上以下代码。

```python

demo/urls.py

from django.contrib import admin from django.urls import path, include from blog.views import blogIndex, article

urlpatterns = [ path("admin/", admin.site.urls), path("blog/", blogIndex), path("blog/article/ /", article) ] ```

admin/ 匹配的是自带后台,blog/ 是博客列表页,blog/article/<str:id>/ 是博客详情页,<str:id> 匹配的是博客 id

然后在 blog 应用中创建2个视图。

```python

blog/views.py

from django.http import HttpResponse from django.shortcuts import render from blog.models import Article

博客列表

def blogIndex(request): articles = Article.objects.all() # 向数据库查询所有博客 return render(request, 'blog.html', { "articles": articles })

博客详情

def article(request, id): article = Article.objects.get(id=id) # 根据博客id,向数据库查询具体博客内容 return render(request, 'article.html', { "article": article }) ```

blog.html 我们在之前的文章中已经创建好了,它在 blog/templates 里。现在需要修改一下它的内容,以便呈现博客列表。

```html

博客 ```

然后再创建 article.html 页面。

```html

{​{ article.title }}
返回
<div class="article_x">
  <h1 class="title">{{ article.title }}</h1>
  <p class="user">作者:{{ article.user }}</p>
  <p class="publish_date">发布时间:{{ article.publish_date }}</p>
  <p>{{ article.content }}</p>
</div>
```

搞掂,做完上述几步就已经把路由、视图、模型的关系串起来了,此时在浏览器访问 http://127.0.0.1:8000/blog/ 就能查看到博客列表页。自己试试吧~

配置封面图

有些博客平台是有封面图的。如果我们也想给自己的博客配置封面图需要怎么做呢?

04.png

要实现封面图的功能需要5步。

  1. 安装 Pillow
  2. 配置模型,给指定应用添加封面图字段
  3. 配置图片存储位置
  4. 生成模型迁移文件,并执行迁移操作
  5. 在页面中加载图片

**先操作第1步,安装 Pillow。**这一步非常简单,只需执行下面这条命令。

pip install Pillow

**第2步,在 blog 应用中,给模型配置一个 cover_image ,**该字段就是用来存储封面图的。

```python

blog/models.py

省略部分代码

class Article(models.Model): coverimage = models.ImageField("封面图", uploadto="cover", default="", help_text="最佳尺寸:256 x 256") ```

models.ImageField 表示这个字段是存图片的。upload_to="cover" 意思是图片要上传到 cover 目录下。

需要注意,因为我们前面已经创建了 Article 这个模型,并且已经填充了数据进这个表了。此时增加一个字段的话,原本已经存在的数据会丢失个字段的信息的。所以在新增 cover_image 时需要配置默认值 default=""

第3步,配置图片存储位置。

我们在项目的根目录下创建一个 media 文件夹,你可以起其他名字。在这个例子中要保存多媒体文件(图片也是一种多媒体),所以我起了一个 media 名字。

然后在项目的 settings.py 文件中加上这两句代码。

python MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media")

意思是多媒体的路径在 /media/

**第4步,生成模型迁移文件,并执行迁移操作。**这步很简单,就是用之前讲过的那2条命令。

python manage.py makemigrations
python manage.py migrate

第5步,在页面中加载图片。

想在浏览器通过指定路径访问到图片资源,还需要给图片资源配置一个路由入口。

在项目的 urls.py 中写上以下代码。

```python

urls.py

省略部分代码

from django.conf import settings from django.conf.urls.static import static

urlpatterns += static(settings.MEDIAURL, documentroot=settings.MEDIA_ROOT) ```

接着就是要处理展示部分的内容了。

打开 blog/templates/blog.html 文件,在文章列表的每一项前面加上一个图片标签,读取 cover_image 这个字段的内容。

<img class="cover_image" src="/media/{{ article.cover_image }}" alt="">

要注意,图片的 src="/media/{{ article.cover_image }}" 这个值,media前面是有一个斜杠的。

blog/templates/blog.html 的完整代码。

```html

博客 ```

最后在后台 http://127.0.0.1:8000/admin/ 手动配置好博客文章的封面图即可。

05.png

富文本

终于到本文最后一节了,富文本。

什么是富文本呢?简单来说,富文本就是一个内容丰富的文本。

相应的,要展示富文本之前,首先需要录入一段富文本内容。所以就有富文本编辑器。

Django 的生态非常丰富,我们可以用 django-ckeditor 这个富文本编辑器实现我们的需求。

先看看这个富文本编辑器长什么样子。

06.png

安装 django-ckeditor 很简单。

pip install django-ckeditor

安装成功后,就要开始一系列的配置了。

首先打开项目的 settings.py 文件,加上这几行代码。

```python

settings.py

INSTALLEDAPPS = [ # 省略部分代码 'ckeditor', 'ckeditoruploader' ] ```

django-ckeditor 这个富文本编辑器也是一个应用,所以需要在项目的 settings.py 里注册这个应用。

ckeditor是富文本编辑器,ckeditor_uploader是富文本上传图片的应用。

安装完 django-ckeditor 后就已经包含 ckeditorckeditor_uploade

然后需要配置富文本上传图片的路径,也是在 settings.py里配置。

在这个文件最下方配置以下内容:

```python

settings.py

配置ckeditor

配置上传的路径

CKEDITORUPLOADPATH = 'upload/'

配置上传图片时使用的后台

CKEDITORIMAGEBACKEND = 'pillow' ```

配置完了,接下来就是使用富文本。

我们会在博客中用到富文本,所以在 blog 应用中配置一下模型。

```python

blog/models.py

省略部分代码

from ckeditor.fields import RichTextField # 导入富文本编辑器 from ckeditor_uploader.fields import RichTextUploadingField # 上传图片

class Article(models.Model): content = RichTextUploadingField() ```

我们将之前的 content = models.TextField() 改成 content = RichTextUploadingField(),意思是使用 django-ckeditor 并且会用到它的上传图片功能。

因为要上传图片,所以还要在项目的 urls.py 里配置一下路由。

```python

urls.py

省略部分代码

urlpatterns = [ # 省略了其他路由... path("ckeditor", include("ckeditor_uploader.urls")) ] ```

path("ckeditor", include("ckeditor_uploader.urls")) 这句是固定写法,因为这个 ckeditor 是我们安装的一个模块,在 Django 中它相当于一个应用,所以这些东西就和 admin 一样,它已经被我们设置好了。

因为修改了 models.py 文件,所以需要重新执行一下迁移动作。

python manage.py makemigrations
python manage.py migrate

之后打开后台的博客编辑模块,编辑博客时就能看到富文本编辑器了。

但是,在保存完富文本内容后,在前台页面显示出来的内容变得有点奇怪了。

07.png

这是因为 Django 有一个自带的安全机制,如果要显示富文本内容,需要在模版中添加一个参数。

打开 blog/templates/blog.html 文件,有一段代码是 <p>{{ article.content }}</p>,意思是展示文章内容。我们需要将这段代码改为 <p>{{ article.content | safe }}</p>,然后重新刷新页面就能正常展示内容了。

08.png

safeDjango 自带的一个过滤器。我在 《『Django』模板使用指南》 中介绍过过滤器的用法。只不过当时没讲 safe 这个过滤器,因为当时没讲到富文本的内容。


以上就是本文的全部内容了,同时也是 《 Django 专栏》的入门篇的全部内容。

学到这里,相信你已经会做一个博客网站出来了。如果你想做一个企业官网,用以上提到的知识也是完全能实现的。

Django 专栏》 这个专栏还会继续写下去,接下来会讲前后端分离、部署到云服务器等内容。

IMG_2110.GIF

点赞 + 关注 + 收藏 = 学会了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】梯度下降的基本概念和如何使用梯度下降自动化优化w和b

引言 梯度下降是一种用于寻找函数最小值的优化算法&#xff0c;它在机器学习中广泛用于训练模型&#xff0c;如线性回归、神经网络等 一、梯度下降的基本概念 1.1 目标函数 在机器学习中&#xff0c;这通常是损失函数&#xff08;如均方误差、交叉熵等&#xff09;&#xff0…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中&#xff0c;资产属于核心地位&#xff0c;攻击方&#xff08;红方&#xff09;要尽可能的去获取对方资产&#xff0c;暴露目标资产&#xff0c;包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

了解网络是如何运作

“Web 的工作原理”提供了一个简化的视图,用于了解在计算机或手机上的 Web 浏览器中查看网页时发生的情况。 这个理论对于短期内编写 Web 代码来说并不是必需的,但不久之后,你就会真正开始从理解后台发生的事情中受益。 客户端和服务器 连接到 Internet 的计算机称为客户端和…

dns逆向解析,主从服务,多域名访问(穿插ntp服务器)

复习 域名解析&#xff1a; 正向解析&#xff1a;将域名解析为ip 反向解析&#xff1a;将ip解析为域名 逆向解析 关闭防火墙和selinux&#xff0c;配置静态ip [rootdns ~]# vim /etc/named.rfc1912.zones [rootdns ~]# vim /etc/named.conf [rootdns ~]# cd /var/named/ [rootd…

刚购买的阿里云服务器该如何配置环境(CentOS)

文章目录 购买开始初始设置登录云服务器安装 Apache 服务安装 MySQL安装 PHP快照 第三方 SSH 登录笔者的话 购买 按照需求购买就行。学生有免费试用一个月的活动&#xff0c;可以试着玩玩。 开始初始设置 登录云服务器 购买完后&#xff0c;点击实例&#xff0c;点击实例名…

Linux下RDMA驱动程序探索系列-2

本系列文章将带领读者逐步了解Linux操作系统下的RDMA子系统。本篇文章作为系列的第二篇&#xff0c;将深入内核态驱动程序的代码&#xff0c;主要介绍如下内容&#xff1a; Driver的初始化流程几个重要verbs回调函数的简介 01、Kernel Driver的初始化流程 由于不同厂商的驱动…

进销存系统开发,含税小计和含税单价计算,含税和不含税,1000元电脑为案例

if (data ! null) {console.log("中断调试&#xff0c;2024-7-25 最终计算税务");//删除不需要会报错var 未来之窗_人工智能_计算_税额 parseFloat((data.price * data.num * data.tax_rate / 100 ).toFixed(2));var 未来之窗_人工智能_计算_含税小计 parseFloat((…

js轮播图制作

实现一个简单的JavaScript轮播图可以通过以下步骤完成&#xff1a; 创建HTML结构&#xff0c;包括轮播图容器和图片列表。 使用CSS进行样式设置&#xff0c;包括隐藏多余的图片。 使用JavaScript编写函数来控制图片的切换。

07-15 周一 lmdeploy导出迁移因子到量化模型中

07-15 周一 lmdeploy导出迁移因子到量化模型中 时间版本修改人描述2024年7月15日14:57:02V0.1宋全恒新建文档 简介 方案设计 由于norm层的前后导致smoothquant执行量化不好融合&#xff0c;为了降低我事先的难度&#xff0c;所以就不再融合normalization的算子了&#xff0c…

vue3编程-import.meta.glob实现动态路由(菜单)

import.meta.glob 是vite提供的批量懒加载组件的方法 本地开发环境&#xff1a; const modules import.meta.glob(../views/**/*.vue)这段代码返回的modules是一个Map&#xff1a; key是vue文件的相对路径&#xff0c;值是一个函数&#xff0c;将函数打印出来&#xff0c;如…

【微信小程序实战教程】之微信小程序原生开发详解

微信小程序原生开发详解 微信小程序的更新迭代非常频繁&#xff0c;几乎每个月都会有新版本发布&#xff0c;这就会让初学者感觉到学习的压力和难度。其实&#xff0c;我们小程序的每次版本迭代都是在现有小程序架构基础之上进行更新的&#xff0c;如果想要学好小程序开发技术&…

配置mysql8.0.21版本docker-compose启动容器

1. 总览 2 docker-compose.xml配置 version: 3 services:mysql:image: 192.168.188.131:8000/mysqlrestart: alwaysvolumes:- ./data:/var/lib/mysql- ./my.cnf:/etc/mysql/my.cnf- ./mysql-files:/var/lib/mysql-files- ./log/mysql:/var/log/mysqlenvironment:MYSQL_ROOT_PA…

Shell实现服务自动部署

一、环境 注意&#xff1a; nfs.example.com应该为nfs.exam.com 172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。 172.25.250.106 由 serverb.exam.com 服务器进行提供。 二、需求 项目需求&#xff1a; 1. 172.25.250.101 主机上的 W…

UEFI DebugLib 介绍

1.我们调试中常用Debug 打印信息&#xff0c;这些会输出到BIOS串口日志中 EFI_STATUSEFIAPIHelloWorld2(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){EFI_STATUS Status;StatusEFI_SUCCESS;gST->ConOut->OutputString(gST->ConOut,L&q…

如何保护您的 WordPress 不被黑?

明月可以说是见到过太多 WordPress 网站被黑的示例了&#xff0c;加上平时明月也会接一些 WordPress 疑难杂症的解决服务订单&#xff0c;所以这方面绝对是专业对口了。作为一个资深 WordPress 博客站长&#xff0c;谁都有被黑过的经历&#xff0c;都是一步步走过来的&#xff…

从零入门AI for Science(AI+化学)#Datawhale AI 夏令营

基于天池平台“第二届世界科学智能大赛 物质科学赛道&#xff1a;催化反应产率预测”使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset 赛事官网 上海科学智能研究院 http://competition.sais.com.cn/competitionDetail/532233/myScore Task1 …

七、SpringBoot日志

1. 得到日志对象 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; //打印日志…

【Vue实战教程】之Vue工程化项目详解

Vue工程化项目 随着多年的发展&#xff0c;前端越来越模块化、组件化、工程化&#xff0c;这是前端发展的大趋势。webpack是目前用于构建前端工程化项目的主流工具之一&#xff0c;也正变得越来越重要。本章节我们来详细讲解一下如何使用webpack搭建Vue工程化项目。 1 使用we…

Web渗透-WAF绕过技巧

一、WAF简介 Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a; WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略…

叮!2024 龙蜥操作系统大会议题征集正式启动

定啦&#xff01;2024 龙蜥操作系统大会&#xff08;OpenAnolis Conference&#xff0c;以下简称“龙蜥大会”&#xff09;将于 2024 年 8 月 30 日在北京中关村国家自主创新示范区会议中心盛大召开。 2024 龙蜥大会由中关村科学城管委会、海淀区委网信办、中国开源软件推进联…