二 Django入门( 五 )


页面收到GET请求时 , ()将返回一个表单 , 让用户能够对条目进行编辑 。该页面收到POST请求(条目文本经过修订)时 , 它将修改后的文本保存到数据库中 。
# vim learning_logs/views.py
from django.shortcuts import renderfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom .models import Topic, Entryfrom .forms import TopicForm, EntryFormdef index(request):"""学习笔记的主页"""return render(request, 'learning_logs/index.html')def topics(request):"""显示所有主题"""topics = Topic.objects.order_by('date_added')context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)def topic(request, topic_id):"""显示一个主题及其详细页面"""topic = Topic.objects.get(id=topic_id)entries = topic.entry_set.order_by('-date_added')context = {'topic': topic, 'entries': entries}return render(request, 'learning_logs/topic.html', context)def new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据 , 对数据进行处理form = TopicForm(request.POST)if form.is_valid():form.save()return HttpResponseRedirect(reverse('learning_logs:topics'))context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)def new_entry(request, topic_id):"""在特定的主题中添加新条目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交数据 , 创建一个空表单form = EntryForm()else:# POST提交的数据 , 对数据进行处理form = EntryForm(data=http://www.kingceram.com/post/request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic_id]))context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)def edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif request.method != 'POST':# 初次请求 , 使用当前条目填充表单form = EntryForm(instance=entry)else:# POST提交的数据 , 对数据进行处理form = EntryForm(instance=entry, data=http://www.kingceram.com/post/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/new_entry.html', context)
首先导入模型Entry。接着获取用户要修改的条目对象 , 以及与该条目相关联的主题 。在请求方法为GET时 , 我们使用实参=entry创建一个实例 。该实参让创建一个表单 , 并使用既有条目对象中的信息填充它 。用户将看到既有的数据 , 并能够编辑它们 。
处理POST请求时 , 传递实参=entry和data=http://www.kingceram.com/post/.POST , 让根据既有条目对象创建一个表单实例 , 并根据.POST中的相关数据对其进行修改 。然后检查表单是否有效 , 如果有效就调用save()且不指定任何实参 。接下来重定向到显示条目所属主题的页面 , 用户将在其中看到其编辑的条目的新版本 。
# vim learning_logs/templates/learning_logs/edit_entry.html
{% extends "learning_logs/base.html" %}{% block content %}{{ topic }}
Edit entry:

{% csrf_token %}{{ form.as_p }}