内容简介:目前为止我们已经完成了文章的新建、删除以及查看,还剩最后一项,即对已经完成的文章进行修改。实际上修改文章与新建文章有点类似,不同的地方有两点:按照这个思路,接下来先写视图函数。
目前为止我们已经完成了文章的新建、删除以及查看,还剩最后一项,即对已经完成的文章进行修改。
实际上修改文章与新建文章有点类似,不同的地方有两点:
- 修改是在原有文章的基础上,因此需要传递 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) 复制代码
更新的视图与创建文章非常相似,但又有点小区别:
redirect
编写模板
模板文件就与创建文章的更像了,不过我们这里还是重新写一遍。
新建 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 %} 复制代码
在模板中,分别将文章旧的标题和正文作为初始值,传递了进去,其他就与新建文章的模板完全没区别了。
有读者可能就会问了,既然这两个函数、模板都很相似,**能不能合并成一个函数、模板呢?**当然是可以的,合并相同功能的函数可以让代码更加简洁漂亮,也便于后期的维护。有兴趣的读者可以自己尝试一下。
URL 和入口
接下来的套路都懂的,配置路由 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页面寻找出错的线索,求助网络帮忙解决吧。
总结
至此我们就实现了一篇文章的增、删、改、查四个基础功能,也算小有成就。
当然还有很多进阶的功能可以去做,不过我们在这里先休息休息,来罐快乐水庆祝一下。
下一章开始解决更加燃眉之急的内容:用户管理。
- 有疑问请在杜赛的个人网站留言,我会尽快回复。
- 或Email私信我:dusaiphoto@foxmail.com
- 项目完整代码: Django_blog_tutorial
转载请告知作者并注明出处。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Uber发布开源AI工具包Ludwig,开发者无需编程即可完成模型搭建
- 利用python完成大学刷课(从0到完成的思路)
- 如何用短信完成XSS?
- 神经网络如何完成表征?
- 完成端口服务器模型
- 机器阅读(二)--模型(未完成)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
随机密码生成器
多种字符组合密码
RGB HSV 转换
RGB HSV 互转工具