前面我们已经学会如何用Markdown语法书写文章了。
但是还有问题呀。之前写文章都是在后台中进行的,万一有别的普通用户也要发表文章怎么办?万一我想拓展些后台中没有的提交验证功能又怎么办?
本章即讲述如何在前台中提交新的文章,以便满足开发者各种各样的特殊需求。
Forms表单类
在HTML中,表单是在 <form>...</form>
中的一些元素,它允许访客做类似输入文本、选择选项、操作对象或空间等动作,然后发送这些信息到服务端。一些表单界面元素(文本框或复选框)非常简单并内置在HTML中,而其他会复杂些:像弹出日期选择等操作控件。
处理表单是一件挺复杂的事情。想想看Django的admin,许多不同类型的数据可能需要在一张表单中准备显示,渲染成HTML,使用方便的界面进行编辑,传到服务器,验证和清理数据,然后保存或跳过进行下一步处理。
Django的表单功能可以简化上述工作的大部分内容,并且也能比大多数程序员自己编写代码去实现来的更安全。
Django表单系统的核心组件是 Form
类,它能够描述一张表单并决定它如何工作及呈现。
要使用Form
类也很简单,需要在article/
中创建forms.py
文件,并写入如下代码:
article/forms.py
# 引入表单类
from django import forms
# 引入文章模型
from .models import ArticlePost
# 写文章的表单类
class ArticlePostForm(forms.ModelForm):
class Meta:
# 指明数据模型来源
model = ArticlePost
# 定义表单包含的字段
fields = ('title', 'body')
代码中ArticlePostForm
类继承了Django的表单类forms.ModelForm
,并在类中定义了内部类class Meta
(之前提到过,还记得吗),指明了数据模型的来源,以及表单中应该包含数据模型的哪些字段。
在ArticlePost
模型中,created
和updated
字段为自动生成,不需要填入;author
字段暂时固定为id=1的管理员用户,也不用填入;剩下的title
和body
就是表单需要填入的内容了。
接下来,改写article/views.py
,添加一个视图函数以处理写文章的请求:
article/views.py
...
# 引入redirect重定向模块
from django.shortcuts import render, redirect
# 引入HttpResponse
from django.http import HttpResponse
# 引入刚才定义的ArticlePostForm表单类
from .forms import ArticlePostForm
# 引入User模型
from django.contrib.auth.models import User
...
# 写文章的视图
def article_create(request):
# 判断用户是否提交数据
if request.method == "POST"