模板内一篇已经存在的文章,点击编辑后,进入编辑页面,完成编辑后,回到这篇文章的页面(回到原点)。
先看文章模板:
{# show and go to edit a note #} <div> <h3>{{pk_note.title}}</h3> <p><a href="{% url 'notebook:edit_note' pk_note.pk %}">edit</a></p> <p>Create time:{{pk_note.pub_time}} Update time:{{pk_note.update_time}}</p> {% autoescape off %} <p>{{pk_note.content}}</p> {% endautoescape %} <p>{{pk_note.personal_tags.all}}</p> </div>
这里会显示文章的各种内容,通过一个edit链接出去,这里除了要指向那个用于编辑的views函数以外,还要传递当前这篇文章的pk值。从文章界面到编辑界面,再重回文章界面,都是对同一个pk值的文章进行操作。
在views函数里,需要反向地将一个模型内容,存入到form里,然后显示出来:
def edit_note(request, pk): the_note = get_object_or_404(MyNote, id=pk) if request.method != 'POST': form = NoteForm(instance=the_note) all_comment = the_note.comment_set.all().order_by('-add_time') context = {'form': form, 'the_note': the_note, 'all_comment': all_comment} return render(request, 'edit_note.html', context) else: form = NoteForm(instance=the_note, data=request.POST) if form.is_valid(): form.save() return HttpResponseRedirect(reverse('notebook:one_note', args=[the_note.pk]))
关键的表达式是:form = NoteForm(instance=the_note)
由于编辑的模板继承于文章的模板(base.html ——》one_note.html ——》edit_note.html),而文章模板里有显示已经存在的评论,因此这里还需要取出所有的评论,并且放入上下文。
if的部分,负责呈现编辑界面,else的部分负责保存编辑的内容,以及跳转,else的部分和新增一篇文章基本上完全一致。
{% block content %} {# edit a note and show again #} <div class="left"> <form action="{% url 'notebook:edit_note' the_note.pk %}" method="post"> {% csrf_token %} {{form.as_p}} <input type="submit" value="Save" /> </form> </div> {% endblock content %}
编辑的模板就是将前面提到的form里的内容呈现出来,在提交后,重新回到edit_note函数。
这里要特别注意,这个模板在提交后需要回传当前文章的pk值,因此,还要把代表这个文章的变量也传入到上下文:'the_note': the_note,然后在action里,把pk值取出来。