上一篇:ChatGPT搭建博客Django的web网页添加用户系统(二)
下一篇:搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)
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博客首页添加轮播图功能,我们需要完成以下步骤:
首先,创建一个新的模型 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
然后,运行 makemigrations 和 migrate 命令来创建数据库表。
bash复制代码python manage.py makemigrations
python manage.py migrate
在视图中获取所有激活的轮播图数据,并传递给模板。
# 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})
在 post_list.html 中添加轮播图的HTML和CSS。
DOCTYPE html>
<html>
<head>
<title>Blogtitle>
<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">Previousspan>
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">Nextspan>
a>
div>
<div class="row mt-5">
<div class="col-md-9">
<h1>Blog Postsh1>
<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 %}">Edita>
<a href="{% url 'post_delete' post.pk %}">Deletea>
{% endif %}
li>
{% endfor %}
ul>
{% block content %}
{% endblock %}
div>
div>
div>
<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>
在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_URL 和 MEDIA_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)
报错

在 Carousel 模型中没有定义 active 字段。你需要确保在 Carousel 模型中有 active 字段,然后在 admin.py 中正确地使用它。
Carousel 模型如果你想要一个 active 字段来表示某个轮播图是否启用,你可以在模型中添加这个字段。
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"
在添加字段后,需要运行迁移命令来更新数据库:
bash复制代码python manage.py makemigrations
python manage.py migrate
admin.py现在你可以在 admin.py 中使用 active 字段。
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)
确保你的模板和视图中也考虑了 active 字段。例如,在显示轮播图时只显示 active 为 True 的图片:
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目录下看到上传的图片如下带后缀:

效果如下:
