2019独角兽企业重金招聘Python工程师标准>>>
定义
from wtforms import Form, StringField, validators
class MyForm(Form):first_name = StringField(u'First Name', validators=[validators.input_required()])last_name = StringField(u'Last Name', validators=[validators.optional()])
form继承
class PastebinEdit(Form):language = SelectField(u'Programming Language', choices=PASTEBIN_LANGUAGES)code = TextAreaField()class PastebinEntry(PastebinEdit):name = StringField(u'User Name')
form里的验证 (跟django区别不大,也就名字换换)
class SignupForm(Form):age = IntegerField(u'Age')def validate_age(form, field):if field.data < 13:raise ValidationError("We're sorry, you must be 13 or older to register")
使用form
def edit_article(request):article = Article.get(...)form = MyForm(request.POST, article)#article 这个是可选的,用过django的应该可以理解,多是get时,初始化form里的字段数据,POST时,就没用了,POST提交时,验证的是request.POSTdef edit_article(request):form = MyForm(request.POST, username='xsds') #这也是在get时,初始化form里的数据def edit_article(request):article = Article.get(...)form = MyForm(request.POST, article,username='xsds')#这种也可以,有关键顺序
典型事例
if request.method == 'POST' and form.validate():form.populate_obj(article)article.save()return redirect('/articles')form.validate()是否验证通过 true or false
在模板使用form的差异;
Jinja中:
<form method="POST" action="/login"><div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div><div>{{ form.password.label }}: {{ form.password() }}</div>
</form>
Django中:
<form method="POST" action="/login"><div>{{ form.username.label }}:</div><div>{{ form.password.label }}:{{ form.password }}</div>
</form>
form.data get 或post请求的数据填充form,是这样 {"username": "dsf", "accept_rules": false, "email": null}}
form.errors 为验证通过显示form的所有错误 {"accept_rules": ["This field is required."], "email": ["Field must be between 6 and 35 characters long."]}
form.meta 是个对象 看着像form的上下文数据,可以用dir(form.meta) 查看提供的属性方法
form.populate_obj() 复制验证过的对象到一个object 如user对象
form.process() 未知
form.validate() 判断验证是否通过
form.username.data 这个字段的数据,验证后才有值,不然是空
form.username.errors 这个字段的错误信息
form.username.default 默认值
这是针对每个字段的方法,大家自己看吧,好多
"data", "default", "description", "do_not_call_in_templates", "errors", "filters", "flags", "gettext", "id", "label", "meta", "name", "ngettext", "object_data", "populate_obj", "post_validate", "pre_validate", "process", "process_data", "process_errors", "process_formdata", "raw_data", "short_name", "type", "validate", "validators", "widget"