19_3编辑条目

  • 创建让用户能够编辑既有条目的页面

a.url模式edit_entry

  • 这个页面的URL需要传递条目的ID

urls.py

--snip--
urlpatterns = [
    --snip--
    #用于编辑条目的页面
    path('edit_entry/<int:entry_id>/',views.edit_entry,name='edit_entry'),
]
#在URL(如:http://xxx/edit_entry/1/)中传递的ID存储在形参entry_id中。这个URL模式将与其匹配的请求发送给视图函数edit_entry()

β.视图函数edit_entry()

  • 页面edit_entry收到GET请求时,edit_entry()将返回一个表单,让用户能够对条目进行编辑
  • 收到POST请求时(条目文本经过修订时),将修改后的文本保存到数据库

views.py

from django.shortcuts import render,redirect
from .models import Topic,Entry
from .forms import TopicForm,EntryForm
--snip--

def edit_entry(request,entry_id):
    '''编辑既有条目'''
1    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic

    if request.method != 'POST':
        #初次请求:使用当前条目填充表单
2      form = EntryForm(instance=entry)
    else:
3        #POST请求的数据:对数据进行处理
       form = EntryForm(instance=entry,data=request.POST)
       if form.is_valid():
4           form.save()
5           return redirect('noways_app:topic',topic_id=topic.id)
    context ={'entry':entry,'topic':topic,'form':form}
    return render(request,'noways_app/edit_entry.html')
  1. 获取用户要修改的条目对象以及与其相关联的主题
  2. 请求为GET执行if代码块,使用实参instance=entry创建一个EntryForm实例,这个实参让Django创建一个表单,并使用既有条目对象中的信息填充它。用户将可以编辑已有的数据
  3. 处理POST请求时,传递实参instance=entry和data=request.POST让Django根据已有条目对象创建一个表单实例,并根据request.POST中的相关数据对其进行修改
  4. 数据有效即调用save()
  5. 因为条目已关联到特定的主题,然后重定向到显示条目所属主题的页面,用户将在其中看到其编辑的条目的新版本
  6. 如果要显示表单让用户编辑条目或者用户提交的表单无效,就创建上下文字典并使用模板edit_entry.html渲染页面

γ.模板edit_entry

edit_entry.html

{% extends "noways_app/base.html" %}
{% block content %}
   <p><a href="{% url 'noways_app:topic' topic.id %}">{{topic}}</a></p>
   <p>编辑条目:</p>
1   <form action="{% url 'noways_app:edit_entry' entry.id %}"method='post'>
     {% csrf_token %}
     {{ form.as_p }}
2     <button name="submit">保存更改</button>
   </form>

{% endblock content %}
  1. 实参action将表单发送给函数edit_entry()处理。在标签{% url %}中,将条目ID作为实参,让视图函数edit_entry()能够修改正确的条目对象。
  2. 将提交按钮的标签设置成保存更改,更加对用户友好。

δ.链接到页面edit_entry

topic.py

--snip--
{% for entry in entries %}
   <li>
     <p>{{entry.date_added|date:'M d,Y H:i'}}</p>
     <p>{{ entry.text|linebreaks }}</p>
     <P>
       <a href="{% url'noways_app:edit_entry'entry.id %}>编辑条目</a>
     </p>
    <li>
--snip--
  • 将编辑链接放在了每个条目的日期和文本后面。
  • 在循环中使用模板标签{% url %}根据URL模式edit_entry和当前条目的ID属性(entry.id)来确定URL
  • 链接文本为编辑条目,他出现在页面中每个条目的后面

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=265
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
19_3编辑条目
创建让用户能够编辑既有条目的页面 a.url模式edit_entry 这个页面的URL需要传递条目的ID urls.py --snip-- urlpatterns = [ --snip-- ……
<<上一篇
下一篇>>