easy_install WTForms # or pip install WTForms
from wtforms import Form, BooleanField, StringField, validators
class RegistrationForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
accept_rules = BooleanField('I accept the site rules', [validators.InputRequired()])
class ProfileForm(Form):
birthday = DateTimeField('Your Birthday', format='%m/%d/%y')
signature = TextAreaField('Forum Signature')
class AdminProfileForm(ProfileForm):
username = StringField('Username', [validators.Length(max=40)])
level = IntegerField('User Level', [validators.NumberRange(min=0, max=10)])
def register(request):
form = RegistrationForm(request.POST)
if request.method == 'POST' and form.validate():
user = User()
user.username = form.username.data
user.email = form.email.data
user.save()
redirect('register')
return render_response('register.html', form=form)
def edit_profile(request):
user = request.current_user
form = ProfileForm(request.POST, user)
if request.method == 'POST' and form.validate():
form.populate_obj(user)
user.save()
redirect('edit_profile')
return render_response('edit_profile.html', form=form)
>>> from wtforms import Form, StringField, validators
>>> class UsernameForm(Form):
... username = StringField('Username', [validators.Length(min=5)], default=u'test')
...
>>> form = UsernameForm()
>>> form['username']
<wtforms.fields.StringField object at 0x827eccc>
>>> form.username.data
u'test'
>>> form.validate()
False
>>> form.errors
{'username': [u'Field must be at least 5 characters long.']}
>>> form2 = UsernameForm(username=u'Robert')
>>> form2.data
{'username': u'Robert'}
>>> form2.validate()
True
def change_username(request):
user = request.current_user
form = ChangeUsernameForm(request.POST, user, username='silly')
if request.method == 'POST' and form.validate():
user.username = form.username.data
user.save()
return redirect('change_username')
return render_response('change_username.html', form=form)
class ChangeEmailForm(Form):
email = StringField('Email', [validators.Length(min=6, max=120), validators.Email()])
class ChangeEmailForm(Form):
email = StringField('Email', [
validators.Length(min=6, message=_(u'Little short for an email address?')),
validators.Email(message=_(u'That\'s not a valid email address.'))
])
>>> from wtforms import Form, StringField
>>> class SimpleForm(Form):
... content = StringField('content')
...
>>> form = SimpleForm(content='foobar')
>>> str(form.content)
'<input id="content" name="content" type="text" value="foobar" />'
>>> unicode(form.content)
u'<input id="content" name="content" type="text" value="foobar" />'
>>> form.content(style="width: 200px;", class_="bar") u'<input class="bar" id="content" name="content" style="width: 200px;" type="text" value="foobar" />'
class LoginForm(Form):
username = StringField('Username')
password = PasswordField('Password')
form = LoginForm()
<form method="POST" action="/login">
<div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div>
<div>{{ form.password.label }}: {{ form.password() }}</div>
</form>
{% load wtforms %}
<form method="POST" action="/login">
<div>
{{ form.username.label }}:
{% form_field form.username class="css_class" %}
</div>
<div>
{{ form.password.label }}:
{{ form.password }}
</div>
</form>
<form method="POST" action="/login"> <div> <label for="username">Username</label>: <input class="css_class" id="username" name="username" type="text" value="" /> </div> <div> <label for="password">Password</label>: <input id="password" name="password" type="password" value="" /> </div> </form>
<form method="POST" action="/login">
<div>{{ form.username.label }}: {{ form.username(class="css_class") }}</div>
{% if form.username.errors %}
<ul class="errors">{% for error in form.username.errors %}<li>{{ error }}</li>{% endfor %}</ul>
{% endif %}
<div>{{ form.password.label }}: {{ form.password() }}</div>
{% if form.password.errors %}
<ul class="errors">{% for error in form.password.errors %}<li>{{ error }}</li>{% endfor %}</ul>
{% endif %}
</form>
{% if form.errors %}
<ul class="errors">
{% for field_name, field_errors in form.errors|dictsort if field_errors %}
{% for error in field_errors %}
<li>{{ form[field_name].label }}: {{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
from wtforms.validators import ValidationError
def is_42(form, field):
if field.data != 42:
raise ValidationError('Must be 42')
class FourtyTwoForm(Form):
num = IntegerField('Number', [is_42])
class FourtyTwoForm(Form):
num = IntegerField('Number')
def validate_num(form, field):
if field.data != 42:
raise ValidationError(u'Must be 42')
class TagListField(Field):
widget = TextInput()
def _value(self):
if self.data:
return u', '.join(self.data)
else:
return u''
def process_formdata(self, valuelist):
if valuelist:
self.data = [x.strip() for x in valuelist[0].split(',')]
else:
self.data = []
class TagListField(Field):
widget = TextInput()
def __init__(self, label=None, validators=None,
**kwargs):
super(TagListField, self).__init__(label, validators, **kwargs)
def _value(self):
if self.data:
r = u''
for obj in self.data:
r += self.obj_to_str(obj)
return u''
else:
return u''
def process_formdata(self, valuelist):
print 'process_formdata..'
print valuelist
if valuelist:
tags = self._remove_duplicates([x.strip() for x in valuelist[0].split(',')])
self.data = [self.str_to_obj(tag) for tag in tags]
else:
self.data = None
def pre_validate(self, form):
pass
@classmethod
def _remove_duplicates(cls, seq):
"""去重"""
d = {}
for item in seq:
if item.lower() not in d:
d[item.lower()] = True
yield item
@classmethod
def str_to_obj(cls, tag):
"""将字符串转换位obj对象"""
tag_obj = Tag.query.filter_by(name=tag).first()
if tag_obj is None:
tag_obj = Tag(name=tag)
return tag_obj
@classmethod
def obj_to_str(cls, obj):
"""将对象转换为字符串"""
if obj:
return obj.name
else:
return u''
class TagListField(Field):
widget = TextInput()
def __init__(self, label=None, validators=None,
**kwargs):
super(TagListField, self).__init__(label, validators, **kwargs)
def _value(self):
if self.data:
r = u''
for obj in self.data:
r += self.obj_to_str(obj)
return u''
else:
return u''
def process_formdata(self, valuelist):
print 'process_formdata..'
print valuelist
if valuelist:
tags = self._remove_duplicates([x.strip() for x in valuelist[0].split(',')])
self.data = [self.str_to_obj(tag) for tag in tags]
else:
self.data = None
def pre_validate(self, form):
pass
@classmethod
def _remove_duplicates(cls, seq):
"""去重"""
d = {}
for item in seq:
if item.lower() not in d:
d[item.lower()] = True
yield item
@classmethod
def str_to_obj(cls, tag):
"""将字符串转换位obj对象"""
tag_obj = Tag.query.filter_by(name=tag).first()
if tag_obj is None:
tag_obj = Tag(name=tag)
return tag_obj
@classmethod
def obj_to_str(cls, obj):
"""将对象转换为字符串"""
if obj:
return obj.name
else:
return u''
...
class ArticleForm(Form):
"""编辑文章表单"""
title = StringField(u'标题', validators=[Required()])
category = QuerySelectField(u'分类', query_factory=get_category_factory(['id', 'name']), get_label='name')
tags = TagListField(u'标签', validators=[Required()])
content = PageDownField(u'正文', validators=[Required()])
submit = SubmitField(u'发布')
...
...
class ArticleForm(Form):
"""编辑文章表单"""
title = StringField(u'标题', validators=[Required()])
category = QuerySelectField(u'分类', query_factory=get_category_factory(['id', 'name']), get_label='name')
tags = TagListField(u'标签', validators=[Required()])
content = PageDownField(u'正文', validators=[Required()])
submit = SubmitField(u'发布')
...
在views.py中处理表单就很方便了:
def edit_article():
"""编辑文章"""
form = ArticleForm()
if form.validate_on_submit():
article = Article(title=form.title.data, content=form.content.data)
article.tags = form.tags.data
article.category = form.category.data
try:
db.session.add(article)
db.session.commit()
except:
db.session.rollback()
return render_template('dashboard/edit.html', form=form)
def edit_article():
"""编辑文章"""
form = ArticleForm()
if form.validate_on_submit():
article = Article(title=form.title.data, content=form.content.data)
article.tags = form.tags.data
article.category = form.category.data
try:
db.session.add(article)
db.session.commit()
except:
db.session.rollback()
return render_template('dashboard/edit.html', form=form)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有