19.1.3 编辑条目
下面来创建一个页面,让用户能够编辑既有的条目:
1.URL 模式edit_entry:
这个页面的URL需要传递要编辑的条目的ID,修改后的lerning_logs/urls.py如下:
urls.py
node2:/django/mysite/learning_log/learning_logs#cat urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.index,name='index'),
url(r'^topics/$',views.topics,name='topics'),
url(r'^new_topic/$',views.new_topic,name='new_topic'),
url(r'^topics/(?P<topic_id>d+)/$',views.topic,name='topic'),
url(r'^new_entry/(?P<topic_id>d+)/$',views.new_entry,name='new_entry'),
url(r'edit_entry/(?P<entry_id>d+)$',views.edit_entry,name='edit_entry'),
]
在URL(如http://localhost:8000/edit_entry/1/)中传递的ID存储在形参entry_id中,
这个URL模式将预期匹配的请求发送给视图函数edit_entry()
2.视图函数edit_entry()
页面edit_entry收到GET请求时,edit_entry()将返回一个表单,
让用户能够对条目进行编辑。该页面收到POST请求(条目文本经过修订)时,
它将修改后的文本保存到数据库中
from django.shortcuts import render
--snip--
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
--snip--
def edit_entry(request, entry_id):
""" 编辑既有条目 """
? entry = Entry.objects.get(id=entry_id)
topic = entry.topic
if request.method != 'POST':
# 初次请求,使用当前条目填充表单
? form = EntryForm(instance=entry)
else:
# POST 提交的数据,对数据进行处理
? form = EntryForm(instance=entry, data=request.POST)
if form.is_valid():
? form.save()
? return HttpResponseRedirect(reverse('learning_logs:topic',
args=[topic.id]))
context = {'entry': entry, 'topic': topic, 'form': form}
return render(request, 'learning_logs/edit_entry.html', context)
我们首先需要导入模型Entry. 在1处,我们获取用户要修改的条目对象,
以及与该条目相关联的主题。 在请求方法为GET时将执行的if代码块中,
我们使用实参instance=entry创建一个EntryForm实例。
这个实参让Django创建一个表单,并使用既有条目对象中的信息填充它。
用户将看到既有数据,并能编辑它们
处理POST请求时,我们传递实参instance=entry和data=request.POST,让Django根据既有条目
对象创建一个表单实例,并根据request.POST中的相关数据对其进行修改。
3.模板edit_entry.html
edit_entry.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
<p>Edit entry:</p>
<form action="{% url 'learning_logs:edit_entry' entry.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">save changes</button>
</form>
{% endblock content %}
node2:/django/mysite/learning_log/learning_logs/templates/learning_logs#cat topic.html
{% 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 'learning_logs:edit_entry' entry.id %}">edit entry</a>
</p>
</li>
{% endfor %}