基于Django的Blog 11.修改文章

完成修改文章模块

1. 了解新建文章和修改文章的区别

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

2. 视图函数

article/views.py


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对象也传递到模板中区,以便后续的调用

3. 模板创建

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 %}

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

4. URL和入口

配置url

articles/urls.py

    # 更新文章
    path('article-update/<int:id>/', views.article_update, name='article_update'),

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

<div class=""

posted on 2020-07-05 21:05  sunnywillow  阅读(68)  评论(0)    收藏  举报