目标:创建一个页面,让用户能够编辑现有的条目。
1.URL模式edit_entry
learning_logs/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
--snip--
# to edit the page
# 代码/(?P<entry_id>\d+)/与包含在两个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中
url(r'^edit_entry/(?P<entry_id>\d+)/$',views.edit_entry,name='edit_entry'),
]
2.视图函数edit_entry()
from django.shortcuts import render
--snip--
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
--snip--
def edit_entry(request,entry_id):
# 根据entry的id获得需要编辑的条目对象
entry = Entry.objects.get(id=entry_id)
# 获取这个条目的主题(外键问题??)
topic = entry.topic
# 如果请求的方式是GET
if request.method != 'POST':
# 我们创建一个表单,并且通过传递实参(instance=entry)使用原有的条目数据填充它
form = EntryForm(instance=entry)
else:
# 处理POST请求时,传递实参instance和data,用原有的条目填充它,并且根据data=request.POST的数据对其修改
form = EntryForm(instance=entry,data=request.POST)
# 数据是否规范
if form.is_valid():
form.save()
# 重定向到topic页面
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)
3.模板edit_entry
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>
<!-- 实参action将表单发回给函数edit_entry进行处理,这里需要传递条目的id -->
<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 %}
4.链接到edit_entry
topic.html
{% extends 'learning_logs/base.html' %}
{% block content %}
--snip--
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<p>{{ entry.text|linebreaks }}</p>
<!-- link to the page to edit entries-->
<P>
<a href ="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
</P>
</li>
<!-- if there is no entry, print 'there are...' -->
{% empty %}
<li>
There are no entries for this topic yet.
</li>
{% endfor %}
</ul>
{% endblock content %}