博客五部曲之一 - 简单博客


1263 浏览 5 years, 3 months

20 ModelForm & 创建视图

版权声明: 转载请注明出处 http://www.codingsoho.com/

这一节我们会用ModelForm来创建我们的对象,我们也可以用标准的Form做处理,但是ModelForm根据快速地绑定Model来开发想要的功能。

首先创建一个新的文件posts.forms.py,添加下面代码

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = [
            'title',
            'content'
        ]

修改view函数,在新模板里渲染该Form,并对Form的返回数据进行处理

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <h1>Form</h1>
    <form method="POST" action="">{% csrf_token %}
        {{form.as_p}}
        <input type="submit" name="create post">
    </form>
</body>
</html>

上面是新加的模板post_create.html,对每一行做一些解释

  • form需要用<form></form>包起来,默认的方法是GET,本例中我们用POST方法去提交数据,可以在action里指定提交的URL,空表示当前URL。POST提交必须加上{% csrf_token %}来规避攻击。
  • form.as_p表示as paragraph,以段落形式显示,也可以as_table,为表格形式
  • 最后要加上提交按钮,类型为submit
def post_create(request):
    form = PostForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
    context = {
        'form':form
    }

    return render(request, 'post_create.html', context)

在上面的视图处理函数中

  • 首先生成PostForm,这包括了初始化和POST提交两个场景,所以用了两个参数request.POST和None。如果仅仅为空,那么表单无法获取提交数据进而验证,如果仅仅是request.POST,那么初始化时会提示验证错误,因为表单初始化时是没有数据的
  • 在使用表单数据之前,一定要先执行is_valid,以确保数据都是有效的,执行该语句之后,我们才能够读取cleaned_data这个处理过的数据字典。
  • form.save返回实例,根据当前ModelForm绑定的Model和Form里的数据生成,commit=False表示只是生成数据内容,并不写进数据库。如果commit=True,它会同时写进数据库。Commit=False功能非常有用,因为有时候在写进数据库之后我们还需要针对数据做一些处理,可以放在这个操作之后。
  • instance.save()即把数据写进数据库。