新建forms.py文件
from django import forms # 引入表单类
from .models import ArticlePost # 引入文章模型
# 文章的表单类
class ArticlePostForm(forms.ModelForm):
class Meta:
model = ArticlePost # 指明数据模型来源
fields = ('title', 'body') # 定义表单包含的字段
修改视图类
当视图函数接收到一个客户端的request请求时,首先根据request.method判断用户是要提交数据(POST)、还是要获取数据(GET):
- 如果用户是提交数据,将POST给服务器的表单数据赋于article_post_form实例。然后使用Django内置的方法.is_valid()判断提交的数据是否满足模型的要求。
- 如果满足要求,保存表单中的数据(但是commit=False暂时不提交到数据库,因为author还未指定),并指定author为id=1的管理员用户。然后提交到数据库,并通过redirect返回文章列表。redirect可通过url地址的名字,反向解析到对应的url。
- 如果不满足要求,则返回一个字符串”表单内容有误,请重新填写。”,告诉用户出现了什么问题。
如果用户是获取数据,则返回一个空的表单类对象,提供给用户填写
def article_create(request):
"""写文章视图"""
if request.method == 'POST':
article_post_form = ArticlePostForm(data=request.POST) # 将提交的数据复制到表单示例
if article_post_form.is_valid():
new_article = article_post_form.save(commit=False) # 验证提交数据满足模型,保存,但不存到数据库
new_article.author = User.objects.get(id=1) # 创建并传入用户id
new_article.save() # 提交到数据库
return redirect('article:article_list') # 完成后返回文章列表
else:
return HttpResponse("表单数据有误,请重新填写。")
else:
# 用户请求获取数据
article_post_form = ArticlePostForm()
context = {'article_post_form': article_post_form}
return render(request, 'article/create.html', context)
编写模版文件
标签中的内容就是需要提交的表单。method=”post”指定了表单提交的方式为POST(与视图函数中的request.method相联系);action=”.”指定了表单提交的地址为默认的当前url。
关于{% csrf_token %},它是Django中一个与网络安全相关的中间件验证。目前我们暂时不去深究它的实现,只需要知道表单中必须包含它就可以了,否则将会得到一个403错误。
和 {% endblock content %} ```