假设点击add note,进入到新文章添加界面。看以下视图和模板内容:
from django.shortcuts import render, get_object_or_404
from .models import MyNote, Comment
from .forms import NoteForm
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
def add_note(request): if request.method != 'POST': form = NoteForm() context = {'form': form} return render(request, 'add_one.html', context) else: form = NoteForm(request.POST) if form.is_valid(): new_note = form.save() return HttpResponseRedirect(reverse('notebook:one_note', args=[new_note.pk]))
其中else部分可以先不看!先看如何显示新增页面,即if部分。
很简单!在forms.py里定义了一个表格内之后,直接代入到views函数即可,然后作为上下文传入到模板里。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> {% extends 'base.html' %} <title>KNote-{% block title %}add one!{% endblock %}</title> </head> <body> {% block content %} <div class="left"> <form action="{% url 'notebook:add_note' %}" method="post"> {% csrf_token %} {{form.as_p}} <input type="submit" value="submit" /> </form> </div> {% endblock %} </body> </html>
模板中,action表示提交到哪个url里,提交至url同时意味着要执行url所对应的函数,同时表示这一次通过url来执行函数,其方法(method)是post。
这个模板的写法意味着,一个函数将它渲染出来之后,如果执行某些操作,他还重新返回到这个函数。由于这次指定了method=‘’POST‘’,将执行else部分。4行代码分别表示:
- 以一个变量form,接收NoteForm传来的内容
- 验证提交和接收
-
new_note = form.save()这个表达式会先运行右边的内容,将接收到的提交存入数据库,然后从数据库获取,并赋值到左边的new_note
- 重定向,指向notebook:one_note,把刚才提交的文章显示出来。
由于指向一篇单独的文章,使用的url是:path('note/<int:pk>', views.one_note, name='one_note'),也就是通过文章的在数据库的主键来寻找的,所以如果提交了一篇新的文章,你要想再把他显示出来,你必须要知道他的主键,这就要求先存库,再取键值。
尝试直接用form.pk来取值是错误的,因为这时候还没有pk值。