目前为止咱们已经完成了文章的新建、删除以及查看,还剩最后一项,即对已经完成的文章进行修改。html
实际上修改文章与新建文章有点相似,不一样的地方有两点:python
html
中按照这个思路,接下来先写视图函数。git
在ariticle/views.py
中增长修改文章的视图函数article_update()
:github
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)
复制代码
更新的视图与建立文章很是类似,但又有点小区别:django
redirect
函数没有返回文章列表,而是返回到修改后的文章页面去了,所以须要同时把文章的id也打包传递进去,这是url所规定的模板文件就与建立文章的更像了,不过咱们这里仍是从新写一遍。服务器
新建templates/article/update.html
并写入:网络
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" id="body" name="body" rows="12">{{ article.body }}</textarea>
</div>
<button type="submit" class="btn btn-primary">完成</button>
</form>
</div>
</div>
</div>
{% endblock content %}
复制代码
在模板中,分别将文章旧的标题和正文做为初始值,传递了进去,其余就与新建文章的模板彻底没区别了。函数
有读者可能就会问了,既然这两个函数、模板都很类似,**能不能合并成一个函数、模板呢?**固然是能够的,合并相同功能的函数可让代码更加简洁漂亮,也便于后期的维护。有兴趣的读者能够本身尝试一下。post
接下来的套路都懂的,配置路由article/urls.py
:网站
article/urls.py
...
urlpatterns = [
...
# 更新文章
path('article-update/<int:id>/', views.article_update, name='article_update'),
]
复制代码
在文章详情页面tempaltes/article/detail.html
中添加修改文章的入口:
tempaltes/article/detail.html
...
<div class="col-12 alert alert-success">做者:{{ article.author }}
· <a href="#" onclick="confirm_delete()">删除文章</a>
· <a href="{% url "article:article_update" article.id %}">编辑文章</a>
</div>
复制代码
启动服务器,能够看到修改文章的功能就实现了。一样的,若有故障也不要着急,在Debug页面寻找出错的线索,求助网络帮忙解决吧。
至此咱们就实现了一篇文章的增、删、改、查四个基础功能,也算小有成就。
固然还有不少进阶的功能能够去作,不过咱们在这里先休息休息,来罐快乐水庆祝一下。
下一章开始解决更加燃眉之急的内容:用户管理。
转载请告知做者并注明出处。