搭建基于Django的博客系统增加广告轮播图(三)

news2025/3/13 6:55:54

上一篇:ChatGPT搭建博客Django的web网页添加用户系统(二)
下一篇:搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)

功能概述

  1. 增加轮播图显示广告信息。

需求详细描述

1. 增加轮播图显示广告信息

  • 描述: 在博客首页添加轮播图功能,显示广告信息或推荐内容。
  • 功能要求:
    • 轮播图位置:位于页面顶部。
    • 图片上传功能:管理员可以在后台上传和管理轮播图图片。
    • 支持多张图片轮播,每张图片可以包含链接。
    • 自动轮播和手动切换图片。
  • 用户故事:
    • 作为访客,我希望看到首页的轮播图以获取最新的广告或推荐内容。
    • 作为管理员,我希望能够上传和管理轮播图图片。

文件结构图

添加轮播图功能后的文件结构图,其中包含Django项目和应用的主要文件和目录。

myblog/
├── blog/
│   ├── migrations/
│   ├── static/
│   ├── templates/
│   │   ├── blog/
│   │   │   ├── post_list.html
│   │   ├── registration/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   ├── views.py
│   ├── forms.py
├── myblog/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
├── media/
│   ├── carousel_images/
├── manage.py

在博客首页添加轮播图功能的具体实现

为了在Django博客首页添加轮播图功能,我们需要完成以下步骤:

  1. 设置模型 (Models)
    • 创建一个模型用于存储轮播图图片和相关信息。
  2. 创建视图 (Views)
    • 在视图中获取轮播图数据,并传递给模板。
  3. 更新模板 (Templates)
    • 修改首页模板,添加轮播图的HTML和CSS。
  4. 管理后台配置 (Admin)
    • 配置Django Admin管理轮播图内容。

1. 设置模型 (Models)

首先,创建一个新的模型 Carousel 来存储轮播图图片及其相关信息。

# blog/models.py

from django.db import models

class Carousel(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to='carousel_images/')
    link = models.URLField(blank=True, null=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.title

然后,运行 makemigrationsmigrate 命令来创建数据库表。

bash复制代码python manage.py makemigrations
python manage.py migrate

2. 创建视图 (Views)

在视图中获取所有激活的轮播图数据,并传递给模板。

# blog/views.py

from django.shortcuts import render
from .models import Carousel, Post

def post_list(request):
    posts = Post.objects.all()
    carousels = Carousel.objects.filter(active=True)
    return render(request, 'blog/post_list.html', {'posts': posts, 'carousels': carousels})

3. 更新模板 (Templates)

post_list.html 中添加轮播图的HTML和CSS。

<!-- blog/templates/blog/post_list.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Blog</title>
    <!-- 引入Bootstrap样式 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-5">
        <!-- 轮播图开始 -->
        <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
            <ol class="carousel-indicators">
                {% for carousel in carousels %}
                <li data-target="#carouselExampleIndicators" data-slide-to="{{ forloop.counter0 }}" class="{% if forloop.first %}active{% endif %}"></li>
                {% endfor %}
            </ol>
            <div class="carousel-inner">
                {% for carousel in carousels %}
                <div class="carousel-item {% if forloop.first %}active{% endif %}">
                    <img src="{{ carousel.image.url }}" class="d-block w-100" alt="{{ carousel.title }}">
                    {% if carousel.link %}
                    <a href="{{ carousel.link }}" target="_blank">
                        <div class="carousel-caption d-none d-md-block">
                            <h5>{{ carousel.title }}</h5>
                        </div>
                    </a>
                    {% else %}
                    <div class="carousel-caption d-none d-md-block">
                        <h5>{{ carousel.title }}</h5>
                    </div>
                    {% endif %}
                </div>
                {% endfor %}
            </div>
            <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
                <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
            </a>
            <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
                <span class="carousel-control-next-icon" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
            </a>
        </div>
        <!-- 轮播图结束 -->

        <!-- 其他内容 -->
        <div class="row mt-5">
            <div class="col-md-9">
                <h1>Blog Posts</h1>
                <ul>
                    {% for post in posts %}
                    <li>
                        <h2>
                            <a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a>
                        </h2>
                        <p>{{ post.content }}</p>
                        <p>Published by: {{ post.author.username }}</p>
                        {% if user.is_authenticated and user == post.author %}
                        <a href="{% url 'post_edit' post.pk %}">Edit</a>
                        <a href="{% url 'post_delete' post.pk %}">Delete</a>
                        {% endif %}
                    </li>
                    {% endfor %}
                </ul>
                {% block content %}
                {% endblock %}
            </div>
        </div>
    </div>

    <!-- 引入Bootstrap的JavaScript -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

4. 管理后台配置 (Admin)

在Django Admin中配置管理轮播图内容。

# blog/admin.py

from django.contrib import admin
from .models import Post, Carousel

@admin.register(Carousel)
class CarouselAdmin(admin.ModelAdmin):
    list_display = ('title', 'active')
    list_filter = ('active',)
    search_fields = ('title',)

settings.py 中确保已正确配置 MEDIA_URLMEDIA_ROOT 以支持图片上传。

# settings.py

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

在主URL配置中添加对媒体文件的处理。

# myblog/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

解决问题

报错<class 'blog.admin.CarouselAdmin'>: (admin.E108) The value of 'list_display[1]' refers to 'active', which is not a callable, an attribute of 'CarouselAdmin', or an attribute or method on 'blog.Carousel'.

在这里插入图片描述

Carousel 模型中没有定义 active 字段。你需要确保在 Carousel 模型中有 active 字段,然后在 admin.py 中正确地使用它。

1. 更新 Carousel 模型

如果你想要一个 active 字段来表示某个轮播图是否启用,你可以在模型中添加这个字段。

models.py
python复制代码from django.db import models

class Carousel(models.Model):
    image = models.ImageField(upload_to='carousel_images/')
    title = models.CharField(max_length=100, blank=True)
    description = models.CharField(max_length=255, blank=True)
    link = models.URLField(blank=True)
    active = models.BooleanField(default=True)  # 添加active字段

    def __str__(self):
        return self.title if self.title else "Carousel Image"

2. 迁移数据库

在添加字段后,需要运行迁移命令来更新数据库:

bash复制代码python manage.py makemigrations
python manage.py migrate

3. 更新 admin.py

现在你可以在 admin.py 中使用 active 字段。

admin.py
python复制代码from django.contrib import admin
from .models import Carousel

class CarouselAdmin(admin.ModelAdmin):
    list_display = ('title', 'active')  # 添加active字段到list_display
    list_filter = ('active',)           # 添加active字段到list_filter

admin.site.register(Carousel, CarouselAdmin)

4. 确认模板中的更新

确保你的模板和视图中也考虑了 active 字段。例如,在显示轮播图时只显示 activeTrue 的图片:

views.py
python复制代码from django.shortcuts import render
from .models import Carousel, Post, CustomUser

def post_list(request):
    posts = Post.objects.all()
    carousels = Carousel.objects.filter(active=True)  # 只获取active的轮播图
    users = CustomUser.objects.all()
    return render(request, 'blog/post_list.html', {'posts': posts, 'carousels': carousels, 'users': users})

这样,Carousel 模型现在包含 active 字段,admin.py 也正确配置了显示和过滤选项。请确保已经正确运行了数据库迁移命令来更新数据库结构。

报错 raise AlreadyRegistered(msg) django.contrib.admin.exceptions.AlreadyRegistered: The model Carousel is already registered with 'blog.CarouselAdmin'.

上传图片数据

打开控制台能看到Carousels,上传文件

在这里插入图片描述

在这里插入图片描述

上传完成5张图,在/media/carousel_images目录下看到上传的图片如下带后缀:

在这里插入图片描述

效果如下:

在这里插入图片描述

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

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

相关文章

Vue04-模版语法

一、插值语法 作用&#xff1a;将指定的值放在指定的位置。 二、指令语法 效果&#xff1a; 将href中的跳转地址&#xff0c;交给Vue实例管理&#xff1a; Vue的指令&#xff0c;以v-xxxx开头&#xff0c;以表示它们是 Vue 提供的特殊 attribute。 2-1、v-bind命令 可以给标签…

C盘清理攻略!!!详细步骤

c盘爆满怎么清&#xff0c;往下看 一、清缓存文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;%temp% 二、清理安装包文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;softwaredistribution 三、清理软件解压临时文件键盘winr打开运行窗口&#xff0c;输入&#xf…

使用matplotlib绘制折线条形复合图

使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中&#xff0c;复合图形是一种非常有用的工具&#xff0c;可以同时显示多种数据类型的关系。在本篇博客中&#xff0c;我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 imp…

[数据集][目标检测]脑肿瘤检测数据集VOC+YOLO格式9787张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9787 标注数量(xml文件个数)&#xff1a;9787 标注数量(txt文件个数)&#xff1a;9787 标注…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是&#xff0c;代理服务器也有不同的类型。就其来源而言&#xff0c;最常见的代理服务器类型是住宅代理和数据中心代理&#xff1a; 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址&#xff0c;因此允许…

LeetCode-165. 比较版本号【双指针 字符串】

LeetCode-165. 比较版本号【双指针 字符串】 题目描述&#xff1a;解题思路一&#xff1a;字符串分割解题思路二&#xff1a;双指针背诵版&#xff1a; 题目描述&#xff1a; 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 ‘.’ 分开的…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…

灯塔歌曲音乐下载官网

灯塔歌曲音乐下载官网网址&#xff1a;www.dengtamp3.com 灯塔音乐下载上线以“用心服务&#xff0c;认真负责”为核心价值。 我们的团队是一个青春的团队&#xff0c;朝气蓬勃。我们采用最新的服务模式&#xff0c;以网为媒为广大客户提供服务&#xff0c;我们坚持以“用心&a…

“Apache Kylin 实战指南:从安装到高级优化的全面教程

Apache Kylin是一个开源的分布式分析引擎,它提供了在Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力,支持超大规模数据的亚秒级查询。以下是Kylin的入门教程,帮助您快速上手并使用这个强大的工具。 1. 安装Kylin Apache Kylin的安装是一个关键步骤,它要求您具备一…

[QT] MAC使用Qt Creator运行程序如何仅运行一个进程?

大家刚开始使用QtCreator会发现每次run程序&#xff0c;都会出现一个程序进程&#xff0c;使得调试操作增加。如下&#xff0c;每次run都会出现一个demo14的进程。 如何每次run后&#xff0c;就关闭上一次的进程&#xff0c;而重新拉起新进程呢&#xff1f; 看这里 这是默认…

MFC3d立体按钮制作

1、本程序基于前期我的博客文章MFC用CButtonST类实现图片透明按钮(免费源码下载) 2、添加CeXDib.cpp CeXDib.h ShadeButtonST.cpp ShadeButtonST.h到项目文件夹下&#xff0c;和FileView中如图。 3、在ButtonShadeDlg.h中添加代码 #include "ShadeButtonST.h" #in…

pdf文件太大如何变小,苹果电脑压缩pdf文件大小工具软件

压缩PDF文件是我们在日常办公和学习中经常会遇到的需求。PDF文件由于其跨平台、保持格式不变的特点&#xff0c;被广泛应用于各种场合。然而&#xff0c;有时候我们收到的PDF文件可能过大&#xff0c;不便于传输和存储&#xff0c;这时候就需要对PDF文件进行压缩。下面&#xf…

Java实现一个公共方法解析不同类型的表格

首先是公共方法 private String getCellValueAsString(Cell cell) {if (cell null) {return "";}String value "";switch (cell.getCellType()) {case STRING:value cell.getStringCellValue();break;case NUMERIC:if (DateUtil.isCellDateFormatted(ce…

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看&#xff1a;git branch 创建分支: git branch 名字 切换分支&#xff1a;git checkout 名字 合并分支&#xff1a;git…

CS4344国产替代音频DAC数模转换芯片DP7344采样率192kHz

目录 DAC应用简介DP7344简介结构框图DP7344主要特性微信号&#xff1a;dnsj5343参考原理图 应用领域 DAC应用简介 DAC&#xff08;中文&#xff1a;数字模拟转换器&#xff09;是一种将数字信号转换为模拟信号&#xff08;以电流、电压或电荷的形式&#xff09;的设备。电脑对…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

MySQL数据库常见工具的基础使用_1

在上一篇文章中提到了对MySQL数据库进行操作的一些常见工具 mysqlcheck mysqlcheck是一个用于数据库表的检查&#xff0c;修复&#xff0c;分析和优化的一个客户端程序 分析的作用是查看表的关键字分布,能够让sql生成正确的执行计划(支持InnoDB,MyISAM,NDB)检查的作用是检查…

Java【springBoot和springCould引入外部jar包】

在项目的研发过程中&#xff0c;我们经常需要导入外部系统提供的jar包&#xff0c;并且这种jar包并没有上传到开源的maven仓库&#xff0c;属于内部环境的包&#xff0c;那么应该如何添加呢&#xff1f; springBoot 1、首先&#xff0c;将你的 JAR 文件拷贝到项目的 resource…

【k8s 控制器:ReplicaSet、Deployment、StatefulSet ...】

控制器 ReplicaSet、Deployment、StatefulSet 和 DaemonSet 都是 Kubernetes 中的控制器对象&#xff0c;用于管理 Pod 的创建、扩展、缩减和更新等操作。 一、Deployment 适用无状态服务应用部署&#xff1b;Deployment 是在 ReplicaSet 的基础上提供了更高级功能的控制器。它…

QT error: allocation of incomplete type ‘Ui::Server‘

目录 前言 报错内容&#xff1a; 过程解析&#xff1a; 原因分析&#xff1a; daisy.skye的博客 QT合集http://t.csdnimg.cn/wEVbu 前言 最近又开始需要做上位机了&#xff0c;要知道qt上位机对我来说已经3年没有接触了&#xff0c;最开始接触还是毕业时工作中的简单学习和…