代码改变世界

122-django不依赖后台,在前端添加文章(提交后跳转到其他页面)

2020-08-17 12:01  lzhshn  阅读(323)  评论(0编辑  收藏  举报

假设点击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值。