博客五部曲之一 - 简单博客
1498 浏览 5 years, 11 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()即把数据写进数据库。