资讯专栏INFORMATION COLUMN

Django搭建个人博客:完成修改文章功能

terasum / 1145人阅读

摘要:目前为止我们已经完成了文章的新建删除以及查看,还剩最后一项,即对已经完成的文章进行修改。总结至此我们就实现了一篇文章的增删改查四个基础功能,也算小有成就。有疑问请在杜赛的个人网站留言,我会尽快回复。

目前为止我们已经完成了文章的新建、删除以及查看,还剩最后一项,即对已经完成的文章进行修改。

实际上修改文章与新建文章有点类似,不同的地方有两点:

修改是在原有文章的基础上,因此需要传递 id 指明具体需要修改的文章

加载页面时需要将旧的内容作为默认值填写到表单中,因此需要将文章对象传递到html

按照这个思路,接下来先写视图函数。

视图函数

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

article/views.py

...

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

    # 获取需要修改的具体文章对象
    article = ArticlePost.objects.get(id=id)
    # 判断用户是否为 POST 提交表单数据
    if request.method == "POST":
        # 将提交的数据赋值到表单实例中
        article_post_form = ArticlePostForm(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 = ArticlePostForm()
        # 赋值上下文,将 article 文章对象也传递进去,以便提取旧的内容
        context = { "article": article, "article_post_form": article_post_form }
        # 将响应返回到模板中
        return render(request, "article/update.html", context)

更新的视图与创建文章非常相似,但又有点小区别:

文章的 id 作为参数传递进来了

用户POST提交表单时没有创建新的文章,而是在之前的文章中修改

redirect函数没有返回文章列表,而是返回到修改后的文章页面去了,因此需要同时把文章的id也打包传递进去,这是url所规定的

GET获取页面时将article对象也传递到模板中去,以便后续的调用

编写模板

模板文件就与创建文章的更像了,不过我们这里还是重新写一遍。

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

templates/article/update.html

{% extends "base.html" %} {% load staticfiles %}
{% block title %} 更新文章 {% endblock title %}
{% block content %}

{% csrf_token %}
{% endblock content %}

在模板中,分别将文章旧的标题和正文作为初始值,传递了进去,其他就与新建文章的模板完全没区别了。

有读者可能就会问了,既然这两个函数、模板都很相似,能不能合并成一个函数、模板呢?当然是可以的,合并相同功能的函数可以让代码更加简洁漂亮,也便于后期的维护。有兴趣的读者可以自己尝试一下。

URL 和入口

接下来的套路都懂的,配置路由article/urls.py

article/urls.py

...

urlpatterns = [
    ...
    
    # 更新文章
    path("article-update//", views.article_update, name="article_update"),
]

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

tempaltes/article/detail.html

...
作者:{{ article.author }} · 删除文章 · 编辑文章

启动服务器,可以看到修改文章的功能就实现了。同样的,如有故障也不要着急,在Debug页面寻找出错的线索,求助网络帮忙解决吧。

总结

至此我们就实现了一篇文章的增、删、改、查四个基础功能,也算小有成就。

当然还有很多进阶的功能可以去做,不过我们在这里先休息休息,来罐快乐水庆祝一下。

下一章开始解决更加燃眉之急的内容:用户管理。

有疑问请在杜赛的个人网站留言,我会尽快回复。

或Email私信我:dusaiphoto@foxmail.com

项目完整代码:Django_blog_tutorial

转载请告知作者并注明出处。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44838.html

相关文章

  • Django搭建个人博客文章标签功能

    摘要:每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。列表中显示标签虽然保存标签的功能已经实现了,还得把它显示出来才行。更多的用法请阅读官方文档总结本章学习了使用来完成标签功能。 标签是作者从文章中提取的核心词汇,其他用户可以通过标签快速了解文章的关注点。每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。 好在标签功能也有优秀的三方库:D...

    Amio 评论0 收藏0
  • Django搭建个人博客:编写博客文章的Model模型

    摘要:在里写一个数据库驱动的应用的第一步是定义模型,也就是数据库结构设计和附加的其它元数据。模型元数据是任何不是字段的东西,例如排序选项数据库表名单数和复数名称和。 Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。 它们各自的职责如下: 层次 职责 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取...

    winterdawn 评论0 收藏0
  • Django搭建个人博客:简单搜索博客文章

    摘要:更酷的是,我们希望搜索出来的文章也能够按照时间热度等各种方式进行排序。若不为空,则检索特定文章对象。总结本章完成了一个简单的搜索功能,这对于个人博客来说应该够用了。 不管是最新文章列表也好、最热文章列表也罢,都是把所有的文章数据全部展示给了用户。 但是如果用户只关心某些特定类型的文章,抽取全部数据就显得既不方便、又不效率了。 因此,给用户提供一个搜索功能,提供给用户感兴趣的几篇文章,就...

    Alan 评论0 收藏0
  • Django搭建个人博客:创建并配置APP功能模块

    摘要:创建在中的一个代表一个功能模块。就是项目的基石,因此开发博客的第一步就是创建新的,用来实现跟文章相关的功能模块。注意之后,的必须配置,否则会报错。总结本章创建了博客文章功能的,学习了注册并配置。 创建APP 在Django中的一个app代表一个功能模块。开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。app就是项目的基石,因此开发博客的第一步就是创建新的app,用来实现...

    沈俭 评论0 收藏0
  • Django搭建个人博客:编写删除文章功能

    摘要:既然有了写文章的功能,那当然也必须要有删除文章的功能了。编写基本功能有了之前的学习做铺垫,删除文章实现起来就比较简单了。保存所有文件后刷新页面,很好,达到了理想的效果总结本章新增了删除博客文章的功能,并且使用了弹窗组件优化了用户体验。 既然有了写文章的功能,那当然也必须要有删除文章的功能了。 编写基本功能 有了之前的学习做铺垫,删除文章实现起来就比较简单了。 首先增加一个视图函数: a...

    Chaz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<