一、分析

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

  • 修改是在原有文章的基础上,因此需要传递id指明具体需要修改的文字;
  • 加载页面时需要将旧的内容作为默认值填写到表单中,因此需要将文章对象传递到​​html​​中;

二、编写视图函数

在​​article/views.py​​​中增加修改文章的视图函数​​artucle_update()​​:

# 修改文章
def article_update(request, id):
'''
更新文章的视图函数
通过POST方法提交表单,更新title、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​​并写入:

{% extends "base.html" %} {% load staticfiles %}
{% 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" name="body" id="body" rows="12">{{ article.body }}</textarea>
</div>
<button type="submit" class="btn btn-primary">完成</button>
</form>
</div>
</div>
</div>
  • 在模板中,分别将文章旧的标题和正文作为初始值,传递了进去,其他就与新建文章的模板完全没区别了。

四、配置路由

urlpatterns = [
...
# 修改文章
path('article-update/<int:id>/', views.article_update, name='article_update'),

]

五、添加修改文章入口

在文章详情页面​​templates/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-success">
作者:{{ article.author }}
· <a href="#" onclick="confirm_safe_delete()">删除文章</a>
· <a href="{% url "article:article_update" article.id %}">编辑文章</a>
</div>
...
</div>
</div>

六、查看效果

重新启动服务器,验证修改文章功能是否可用。

Django搭建个人博客--修改文章_数据