Django基础教程(八十四)Django实现“碎碎念”组件之“碎碎念”组件管理页面的实现:码海求生指南:手把手教你用Django打造专属“吐槽小本本”,从此告别憋出内伤!

深度分析:Django实现“碎碎念”组件之管理页面全攻略

第一章:开篇唠嗑——我们为什么要造这个“轮子”?

各位码农兄弟姐妹们,有没有那么一瞬间,你脑子里会蹦出一些莫名其妙的想法?

“中午吃啥?黄焖鸡?不行,昨天吃过了...”
“老板刚才那个需求,简直是让我用绣花针给长城贴瓷砖!”
“啊!我追的剧今天更新!”

这些一闪而过的“碎碎念”,就像大脑产生的“精神代谢物”,不记录下来总觉得亏了。用微博太公开,用微信文件传输助手太乱。所以,最好的方式就是——自己动手,丰衣足食!用Django给自己搭建一个绝对私密的“碎碎念”后花园。

今天,咱们不整那些虚头巴脑的企业级项目,就玩点实在的。这个“碎碎念”组件,说白了就是一个超级简单的博客系统,但它麻雀虽小,五脏俱全。通过它,你能把Django最核心的MVT(模型-视图-模板) 开发模式摸得门儿清。以后老板让你做个内容管理系统(CMS),你直接就能套上这个模板,大声告诉他:“So easy!”

第二章:开工前の仪式感——搭建项目地基

首先,确保你的Python和Django环境已经就位。咱们用命令行说话,逼格要高!

# 创建一个专属目录,防止代码乱飞
mkdir my_murmur_site
cd my_murmur_site

# 创建虚拟环境,这是好习惯,就像吃饭前要洗手
python -m venv venv

# 激活虚拟环境(Windows请用 `venv\Scripts\activate`)
source venv/bin/activate

# 安装我们的大明星Django
pip install Django

# 创建项目,名字就叫murmur_site,霸气侧漏
django-admin startproject murmur_site .

# 创建我们的核心App,就叫murmurs,专业!
python manage.py startapp murmurs

完成这一步,你的项目结构应该像个样子了。接下来,我们要去murmur_site/settings.py文件里,把新生的murmurs这个App“上户口”。找到INSTALLED_APPS这个列表,把它加进去:

# murmur_site/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ... # 其他默认的App
    'murmurs', # 就是它!我们的碎碎念App!
]
第三章:设计“念”の灵魂——数据模型(Model)

模型是数据的蓝图,我们的“碎碎念”长啥样,全由它说了算。打开murmurs/models.py文件,让我们开始设计。

一条“碎碎念”需要哪些东西?

  1. 内容:最核心的,你想念叨啥。
  2. 创建时间:记录下你灵光一现的那个瞬间。
  3. 是否公开:万一有的念想有点羞耻,可以设为私密。
  4. (可选)心情标签:比如“开心”、“吐槽”、“脑洞”之类的。

来,代码敲起来:

# murmurs/models.py

from django.db import models

class Murmur(models.Model):
    # 内容,用TextField,想写多长写多长(理论上)
    content = models.TextField(verbose_name="碎碎念内容")
    
    # 创建时间,自动记录创建的那一刻
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    
    # 是否公开,默认是True,让大家都能看到你的“才华”
    is_public = models.BooleanField(default=True, verbose_name="是否公开")
    
    # 心情标签,可选字段,用CharField,最大长度15个字符
    mood_tag = models.CharField(max_length=15, blank=True, verbose_name="心情标签") # blank=True 表示表单项可以为空

    class Meta:
        # 指定在管理后台显示的名称
        verbose_name = "碎碎念"
        verbose_name_plural = "所有碎碎念"
        # 默认按创建时间倒序排列,新的在前面
        ordering = ['-created_at']

    def __str__(self):
        # 这个方法决定了在Django管理后台和其他地方,如何显示这个对象的字符串表示
        # 我们让它显示内容的前20个字符,太长的话用省略号
        return self.content[:20] + "..." if len(self.content) > 20 else self.content

模型建好了,得告诉数据库一声,让它把表给创建出来。执行经典的Django数据库迁移两连:

python manage.py makemigrations
python manage.py migrate

看到OK的字样,恭喜你,数据库的表已经悄咪咪地建好了!

第四章:打造管理后台——让“念”有所归

Django自带一个强大的Admin后台,我们不用白不用。用它来管理我们的“碎碎念”,简直是杀鸡用牛刀——爽歪歪。

首先,我们需要把Murmur模型注册到后台。打开murmurs/admin.py文件:

# murmurs/admin.py

from django.contrib import admin
from .models import Murmur # 从当前目录的models.py导入Murmur类

# 最简单的方式:直接注册
# admin.site.register(Murmur)

# 但是!我们要玩点高级的,自定义一下显示样式
class MurmurAdmin(admin.ModelAdmin):
    # 列表页面上显示哪些字段
    list_display = ('content_short', 'mood_tag', 'is_public', 'created_at')
    
    # 可以根据哪些字段快速过滤,会在页面右侧生成一个过滤器 sidebar
    list_filter = ('is_public', 'mood_tag', 'created_at')
    
    # 可以根据哪些字段进行搜索,会生成一个搜索框
    search_fields = ('content',)
    
    # 定义一个简短内容的方法,用于list_display
    def content_short(self, obj):
        return obj.content[:50] + "..." if len(obj.content) > 50 else obj.content
    content_short.short_description = "内容预览" # 设置表头显示的名称

# 注册模型和自定义的Admin类
admin.site.register(Murmur, MurmurAdmin)

好了,现在我们需要一个超级用户(Superuser)来登录这个后台。回到命令行:

python manage.py createsuperuser

跟着提示,输入用户名、邮箱和密码(密码输入时不可见,别以为是键盘坏了)。

激动人心的时刻到了!启动开发服务器:

python manage.py runserver

打开浏览器,访问 http://127.0.0.1:8000/admin,用你刚才创建的超级用户账号登录。

噔噔噔噔!你会看到Django华丽的管理后台界面,其中就有我们的“所有碎碎念”(Murmurs)入口。点进去,你可以尽情地添加新的碎碎念、查看编辑、甚至删除那些现在看起来有点傻的念头。这就是最基础的管理页面!

第五章:自立门户!——打造我们自己的管理页面

Admin后台虽好,但总不能把这个界面给普通用户用吧?太不专业了!所以,我们要打造一个面向用户(其实就是你自己)的、更简洁美观的管理页面。

这个页面要实现的功能很简单:

  1. 列表展示:把我所有的碎碎念都列出来。
  2. 创建新念:有一个表单可以发布新内容。
  3. 编辑旧念:对某条碎碎念进行修改。
  4. 删除功能:一键送走不想要的念头。

第一步:编写视图(View)—— 大脑逻辑

视图是处理请求和返回响应的核心。我们会在murmurs/views.py里创建几个函数来处理不同的任务。

# murmurs/views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Murmur
from .forms import MurmurForm # 我们等下会创建这个表单

def murmur_list(request):
    """展示所有碎碎念的列表"""
    # 从数据库获取所有的碎碎念,按创建时间倒序
    murmurs = Murmur.objects.all()
    return render(request, 'murmurs/murmur_list.html', {'murmurs': murmurs})

def murmur_create(request):
    """创建新的碎碎念"""
    if request.method == 'POST':
        # 如果表单被提交,我们用提交的数据填充表单
        form = MurmurForm(request.POST)
        if form.is_valid():
            # 检查数据是否有效,有效则保存到数据库
            form.save()
            # 保存成功后,重定向到列表页面
            return redirect('murmur_list')
    else:
        # 如果是GET请求,就展示一个空表单
        form = MurmurForm()
    
    # 渲染创建页面的模板
    return render(request, 'murmurs/murmur_form.html', {'form': form, 'title': '发布新碎碎念'})

def murmur_edit(request, pk):
    """编辑一条已存在的碎碎念"""
    # get_object_or_404 是捷径,如果找不到对应主键的对象,就返回404错误页面
    murmur = get_object_or_404(Murmur, pk=pk)
    
    if request.method == 'POST':
        # 注意这里,我们用instance=murmur,表示是编辑这个已存在的实例
        form = MurmurForm(request.POST, instance=murmur)
        if form.is_valid():
            form.save()
            return redirect('murmur_list')
    else:
        # GET请求时,用已有的murmur数据填充表单
        form = MurmurForm(instance=murmur)
    
    return render(request, 'murmurs/murmur_form.html', {'form': form, 'title': '编辑碎碎念'})

def murmur_delete(request, pk):
    """删除一条碎碎念"""
    murmur = get_object_or_404(Murmur, pk=pk)
    if request.method == 'POST':
        # 确认是POST请求才执行删除,防止直接通过URL误删
        murmur.delete()
        return redirect('murmur_list')
    # 如果是GET请求,可以渲染一个确认删除的页面,这里为了简单,我们直接通过一个简单的表单来POST
    # 在实际项目中,最好有一个确认弹窗或页面
    return render(request, 'murmurs/murmur_confirm_delete.html', {'murmur': murmur})

第二步:设计表单(Form)—— 用户输入界面

Django的表单让我们能轻松生成HTML表单并处理数据验证。创建一个新文件murmurs/forms.py

# murmurs/forms.py

from django import forms
from .models import Murmur

class MurmurForm(forms.ModelForm):
    # 我们可以在这里对表单字段进行额外定制
    # 比如给content字段一个Textarea控件,并定义样式
    content = forms.CharField(
        widget=forms.Textarea(attrs={'rows': 4, 'placeholder': '今天有什么想念叨的?...', 'class': 'form-control'}),
        label='内容'
    )
    
    mood_tag = forms.CharField(
        required=False, # 非必填
        widget=forms.TextInput(attrs={'placeholder': '开心/吐槽/脑洞...', 'class': 'form-control'}),
        label='心情标签'
    )
    
    is_public = forms.BooleanField(
        initial=True, # 默认勾选
        required=False, # 对于BooleanField,False表示非必选
        label='公开可见'
    )

    class Meta:
        model = Murmur # 指定这个表单关联的模型
        fields = ['content', 'mood_tag', 'is_public'] # 指定表单中包含的字段

第三步:配置URL路由—— 指路明灯

现在我们需要告诉Django,哪个URL该由哪个视图函数来处理。先在murmursApp目录下创建urls.py文件:

# murmurs/urls.py

from django.urls import path
from . import views

# 给这个App的URL起个命名空间,防止重名
app_name = 'murmurs'

urlpatterns = [
    path('', views.murmur_list, name='murmur_list'), # 列表页,对应 '/murmurs/'
    path('new/', views.murmur_create, name='murmur_create'), # 创建页, '/murmurs/new/'
    path('<int:pk>/edit/', views.murmur_edit, name='murmur_edit'), # 编辑页, '/murmurs/1/edit/'
    path('<int:pk>/delete/', views.murmur_delete, name='murmur_delete'), # 删除页, '/murmurs/1/delete/'
]

然后,去项目的总路由文件murmur_site/urls.py里,包含我们App的路由:

# murmur_site/urls.py

from django.contrib import admin
from django.urls import path, include # 记得导入include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('murmurs/', include('murmurs.urls')), # 所有以 murmurs/ 开头的URL,都交给murmurs这个App的urls.py去处理
]

第四步:雕琢模板(Template)—— 颜值担当

最后一步,就是写HTML模板了。在murmurs目录下创建templates/murmurs/这个嵌套目录,然后创建我们的模板文件。

murmur_list.html (列表页模板):

<!-- murmurs/templates/murmurs/murmur_list.html -->

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的碎碎念管理后台</title>
    <!-- 引入Bootstrap,让样式好看点 -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h1 class="mb-4">我的碎碎念 <small class="text-muted">管理后台</small></h1>
    <!-- 添加新碎碎念的按钮 -->
    <p>
        <a href="{% url 'murmurs:murmur_create' %}" class="btn btn-success">+ 发布新碎碎念</a>
    </p>
    <!-- 碎碎念列表 -->
    <div class="list-group">
        {% for murmur in murmurs %}
            <div class="list-group-item list-group-item-action">
                <div class="d-flex w-100 justify-content-between">
                    <!-- 内容 -->
                    <p class="mb-1">{{ murmur.content }}</p>
                    <small>
                        <!-- 心情标签 -->
                        {% if murmur.mood_tag %}
                            <span class="badge bg-info">{{ murmur.mood_tag }}</span>
                        {% endif %}
                        <!-- 公开状态 -->
                        {% if murmur.is_public %}
                            <span class="badge bg-success">公开</span>
                        {% else %}
                            <span class="badge bg-secondary">私密</span>
                        {% endif %}
                    </small>
                </div>
                <!-- 创建时间和操作按钮 -->
                <div class="d-flex w-100 justify-content-between">
                    <small class="text-muted">{{ murmur.created_at }}</small>
                    <div>
                        <!-- 编辑按钮 -->
                        <a href="{% url 'murmurs:murmur_edit' murmur.id %}" class="btn btn-sm btn-outline-primary">编辑</a>
                        <!-- 删除按钮,我们指向一个确认页面 -->
                        <a href="{% url 'murmurs:murmur_delete' murmur.id %}" class="btn btn-sm btn-outline-danger">删除</a>
                    </div>
                </div>
            </div>
        {% empty %}
            <!-- 如果列表为空时显示 -->
            <div class="list-group-item">
                <p class="text-center text-muted">还没有任何碎碎念呢,快来发布第一条吧!</p>
            </div>
        {% endfor %}
    </div>
</body>
</html>

murmur_form.html (创建和编辑页的共用模板):

<!-- murmurs/templates/murmurs/murmur_form.html -->

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h1>{{ title }}</h1>
    <form method="post">
        <!-- 千万别忘了这行!Django用于防止跨站请求伪造 -->
        {% csrf_token %}
        
        <!-- 渲染表单字段 -->
        {{ form.as_p }} <!-- as_p 会把每个字段渲染在 <p> 标签里 -->

        <button type="submit" class="btn btn-primary">保存</button>
        <a href="{% url 'murmurs:murmur_list' %}" class="btn btn-secondary">取消</a>
    </form>
</body>
</html>

murmur_confirm_delete.html (删除确认页模板):

<!-- murmurs/templates/murmurs/murmur_confirm_delete.html -->

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>确认删除</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h1>确认删除</h1>
    
    <p>你确定要删除这条碎碎念吗?</p>
    <blockquote class="blockquote">
        "{{ murmur.content }}"
    </blockquote>
    <p class="text-muted"><small>创建于 {{ murmur.created_at }}</small></p>
    <!-- 注意,删除操作要用POST方法 -->
    <form method="post">
        {% csrf_token %}
        <button type="submit" class="btn btn-danger">是的,我确定删除</button>
        <a href="{% url 'murmurs:murmur_list' %}" class="btn btn-secondary">取消</a>
    </form>
</body>
</html>
第六章:大功告成!——看看我们的成果

现在,再次运行服务器 python manage.py runserver,这次访问 http://127.0.0.1:8000/murmurs/

你会看到一个完全由你亲手打造的、简洁美观的“碎碎念”管理页面!你可以:

  • 点击“发布新碎碎念”来添加内容。
  • 在列表里点击每条碎碎念的“编辑”按钮进行修改。
  • 点击“删除”按钮,经过确认后删除它。

整个过程丝滑流畅,没有任何违和感。这,就是你从“Django小白”迈向“全栈萌新”的关键一步!

第七章:尾声与展望

恭喜你!成功用Django实现了“碎碎念”组件的核心管理功能。这个小小的项目,几乎囊括了Web开发中最基础的CRUD(增删改查) 操作。

你可以在这个基础上继续“添油加醋”:

  • 用户系统:让多人可以一起使用,每个人的碎碎念相互独立。
  • 富文本编辑器:让发布内容时可以加粗、换行、插入图片。
  • API接口:用Django REST Framework为你的碎碎念打造API,然后做个手机App。
  • 更漂亮的UI:把Bootstrap换成你喜欢的其他前端框架。

编程最大的乐趣,就在于把想法变成现实。这个“碎碎念”项目就是最好的开始。现在,去发布你的第一条碎碎念吧,内容可以是:“哈哈,老子终于把Django管理页面搞定了!”

Happy Coding!愿你的代码没有Bug,你的“碎碎念”永远有趣!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值