Python + Django4 搭建个人博客(十三):更新文章功能页面实现

本篇我们实现文章管理的最后一个核心功能:修改文章。

修改文章和创建文章实际上差不太多,需要注意两点:

  • 修改文章需要传入ID,指定修改的文章
  • 修改文章需要先读取文章内容,然后再更新

接下来我们就是按照MTV的模式来进行相关的代码实现了。

文章模型之前已经定义好了不需要做改变。

编写视图函数

ariticle/views.py中增加修改文章的视图函数article_update()

# 更新文章
def article_update(request, id):
    """
    更新文章的视图函数
    通过POST方法提交表单,更新titile、body字段
    GET方法进入初始表单页面
    id: 文章的 id
    """

    # 获取需要修改的具体文章对象
    article = Article.objects.get(id=id)
    # 判断用户是否为 POST 提交表单数据
    if request.method == "POST":
        # 将提交的数据赋值到表单实例中
        article_post_form = ArticleForm(data=request.POST)
        # 判断提交的数据是否满足模型的要求
        if article_post_form.is_valid():
            # 保存新写入的 title、body 数据并保存
            article.title = request.POST['title']
            article.body = request.POST['body']
            article.save()
            # 完成后返回到修改后的文章中。需传入文章的 id 值
            return redirect("article:article_detail", id=id)
        # 如果数据不合法,返回错误信息
        else:
            return HttpResponse("表单内容有误,请重新填写。")

    # 如果用户 GET 请求获取数据
    else:
        # 创建表单类实例
        article_post_form = ArticleForm()
        # 赋值上下文,将 article 文章对象也传递进去,以便提取旧的内容
        context = { 'article': article, 'article_post_form': article_post_form }
        # 将响应返回到模板中
        return render(request, 'article/update.html', context)

在这个函数中我们做了如下:

  • 在请求URL的时候,可以传入id参数
  • 根据Request请求的方法不同,分别实现了查询和更新文章的功能

编写模板

更新文章模板和创建文章模板几乎一样,只是在标题和内容的input输入框内我们提前传入了原有文章的对应内容。

新建templates/article/update.html并写入:

{% extends "base.html" %} {% load static %}
{% block title %} 更新文章 {% endblock title %}
{% block content %}
<div class="container">
    <div class="row">
        <div class="col-12">
            <br>
            <form method="post" action=".">
                {% csrf_token %}
                <div class="form-group">
                    <label for="title">文章标题</label>
                    <!-- 在 value 属性中指定文本框的初始值为旧的内容,即 article 对象中的 title 字段 -->
                    <input type="text" class="form-control" id="title" name="title" value="{{ article.title }}">
                </div>
                <div class="form-group">
                    <label for="body">文章正文</label>
                    <!-- 文本域不需要 value 属性,直接在标签体中嵌入数据即可 -->
                    <textarea type="text" class="form-control" id="body" name="body" rows="12">{{ article.body }}</textarea>
                </div>
                <button type="submit" class="btn btn-primary">完成</button>
            </form>
        </div>
    </div>
</div>
{% endblock content %}

修改URL

配置下路由:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello),
    re_path(r'^$', views.article_list),
    path('list/', views.article_list, name='list'),  # 展示文章
    path('detail/<int:id>/', views.article_detail, name='detail'),  # 文章详情
    path('create/', views.article_create, name='create'),  # 写文章
    path('delete/<int:id>/', views.article_delete, name='delete'),# 删除文章
    # 增加更新文章
    path('update/<int:id>/', views.article_update, name='update'),
]

在文章详情页面tempaltes/article/detail.html中添加修改文章的入口:

...
<div class="container">
        <!--    <div class="row">-->
        <!-- 标题及作者 -->
        <h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1>
        <div class="col-12 alert alert-primary">
            <div class="col-12">
                <a>作者:{{ article.author }}</a>
                &nbsp
                <a>{{ article.created|date:'Y-m-d H:i:s' }}</a>
                &nbsp
                <a href="#" data-bs-toggle="modal" data-bs-target="#myModal">删除文章</a>
                <!-- 新增一个隐藏的表单 -->
                <form
                        style="display:none;"
                        id="safe_delete"
                        action="{% url "delete" article.id %}"
                        method="POST"
                >
                    {% csrf_token %}
                    <button type="submit">发送</button>
                </form>
                &nbsp
                <a href="{% url "update" article.id %}">编辑文章</a>
            </div>
        </div>

这里我们再增加一个控制,只有作者才能修改和删除自己的文章。

先修改下我们的article 模型,将author字段修改为User模型的外键:

# 博客文章数据模型
class Article(models.Model):
    # 文章id,主键
    id = models.AutoField(primary_key=True)

    # 文章作者。修改为User的外键,参数 on_delete 用于指定数据删除的方式
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    # 文章标题,models.CharField 为字符串字段,用于保存较短的字符串,比如标题
    title = models.CharField('标题',max_length=100)

    # 文章正文,保存大量文本使用 TextField
    body = models.TextField('文章正文')

    # 文章创建时间,参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间
    created = models.DateTimeField(default=timezone.now)

    # 文章更新时间,参数 auto_now=True 指定每次数据更新时自动写入当前时间
    updated = models.DateTimeField(auto_now=True)

重新迁移下模型

python manage.py makemigrations article

然后在Detail模板中增加对用户的检验。

...
<!-- 写入 base.html 中定义的 content -->
{% block content %}

    <!-- 文章详情 -->
    <div class="container">
        <!--    <div class="row">-->
        <!-- 标题及作者 -->
        <h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1>
        <div class="col-12 alert alert-primary">
            <div class="col-12">
                <a>作者:{{ article.author }}</a>
                &nbsp
                <a>{{ article.created|date:'Y-m-d H:i:s' }}</a>
                &nbsp
                <!-- 只有作者可以修改文章 -->
                {% if user == article.author %}
                <a href="#" data-bs-toggle="modal" data-bs-target="#myModal">删除文章</a>
                <!-- 新增一个隐藏的表单 -->
                <form
                        style="display:none;"
                        id="safe_delete"
                        action="{% url "delete" article.id %}"
                        method="POST"
                >
                    {% csrf_token %}
                    <button type="submit">发送</button>
                </form>
                &nbsp
                <a href="{% url "update" article.id %}">编辑文章</a>
                {% endif %}
            </div>
        </div>

运行服务器:

系统报错如下:

原因是我们之前的Article表中的Author存的是用户名,现在我们把它改成了User的外键,他们之间是通过ID来进行关联的。

所以我们需要手工将MySQL中的Article表中author_id的值修改为User id。

修改完之后重新启动服务器看下效果:

使用另外一个用户登录看看

结语

至此我们就实现了一篇文章的增、删、改、查四个核心功能。

接下来我们将开始学习用户管理的功能实现。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: Python是一种高级编程语言,可以用来开发各种类型的应用程序。DjangoPython的一个开发框架,它提供了一套完整的工具和函数,用于快速开发高质量的Web应用程序。Vue是一种JavaScript框架,用于构建用户界面。 我们可以使用PythonDjango来开发一个后台管理系统,该系统可以用于管理各种数据和业务逻辑。使用Django的ORM(对象关系映射)功能,我们可以轻松地组织和管理数据库中的数据。我们可以定义模型类来表示数据库表,然后使用Django提供的视图和模板来呈现和操作这些数据。 对于PDF文件的处理,可以使用Python中的第三方库来实现。例如,可以使用PyPDF2库来提取PDF文件的内容,或者使用ReportLab库来生成PDF文件。 在后台管理系统中,我们可以使用Vue来构建用户界面。Vue的组件化开发模式可以帮助我们清晰地划分界面,提高开发效率。通过Vue的数据绑定功能,我们可以实现一个交互式的用户界面,以方便用户对数据进行操作和管理。 总结起来,我们可以使用PythonDjango来开发后台管理系统,然后使用Vue来构建用户界面。在系统中处理PDF文件时,可以使用Python的第三方库来实现相关功能。这样的系统将能够方便地管理数据,并提供一个友好和交互式的用户界面。 ### 回答2: Python是一种强大的编程语言,而DjangoPython的一个开发框架,它能够快速地帮助开发者搭建出高效稳定的后台管理系统。而Vue是一种流行的JavaScript框架,能够实现前端页面与后台数据的交互。 在这个后台管理系统中,我们希望能够实现对PDF文件的管理,以及对其进行操作和展示。具体而言,我们希望实现以下功能: 1. 文件上传和保存:用户可以通过该系统上传PDF文件,并将其保存在后台数据库中进行管理。 2. 文件列表展示:系统能够展示已上传的PDF文件列表,包括文件名称、上传时间等信息。 3. 文件预览:用户可以点击某个文件,在前端页面上进行预览,查看PDF文件内容。 4. 文件下载:用户可以选择下载某个PDF文件到本地,以便查看或者进行其他操作。 5. 文件搜索:系统能够根据用户输入的关键词,对已上传的PDF文件进行搜索,并返回相关结果。 为了实现这些功能,我们可以借助Django的文件上传和数据库操作功能前端页面可以使用Vue来展示文件列表和搜索框,并通过Vue的组件化和数据绑定特性实现动态更新。而PDF文件的预览和下载功能,则可以使用一些开源的JavaScript库,如PDF.js等。 总的来说,通过PythonDjango框架和Vue的前端开发能力,结合PDF的相关JavaScript库,我们能够实现一个功能齐全、操作方便的后台管理系统,提供便捷的PDF文件管理和展示功能。 ### 回答3: Python是一种高级编程语言,Django是一个基于Python的Web框架,而Vue是一个流行的JavaScript框架。结合这三者,可以实现一个功能强大的后台管理系统,并且支持生成和展示PDF文件。 首先,使用Django来搭建后台,可以使用Django的模型和视图来定义和处理数据模型。通过定义模型类,可以创建数据库表格,并通过视图函数来处理用户的请求,并返回相应的数据或页面。 在前端部分,可以使用Vue来构建用户界面和交互逻辑。Vue有很多强大的功能,比如组件化、双向数据绑定和虚拟DOM等,可以提高开发效率和用户体验。可以使用Vue的组件来实现后台管理系统的各种页面功能模块,比如用户管理、文章管理、数据统计等。 为了支持PDF的生成和展示,可以使用Python的第三方库,比如ReportLab来生成PDF文件。ReportLab提供了丰富的API来创建和编辑PDF,可以用于生成包含动态数据的PDF报告或文档。生成PDF后,可以使用Django的文件管理系统来存储和管理生成的PDF文件,同时可以通过Django的视图函数和模板来展示PDF文件或提供下载功能。 总结来说,使用PythonDjango框架和Vue框架,可以快速开发一个功能丰富的后台管理系统。通过结合Python的第三方库,还可以支持PDF的生成和展示功能。这样的系统既具备了后台数据管理的功能,又提供了良好的用户界面和交互体验,能够满足现代Web应用的需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值