嗨,我有一个表格类,如下所示: -
class UserCreateForm(wtf.Form):
name=wtf.TextField('Name',validators=[validators.Required(),username_check])
email=wtf.TextField('Email')
userimage=wtf.FileField(u'Upload Image',validators=[checkfile])
Run Code Online (Sandbox Code Playgroud)
自定义验证器函数"checkfile"如下所示: -
def checkfile(form,field):
if field.data:
filename=field.data.lower()
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
if not ('.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS):
raise ValidationError('Wrong Filetype, you can upload only png,jpg,jpeg,gif files')
else:
raise ValidationError('field not Present') # I added this justfor some debugging.
Run Code Online (Sandbox Code Playgroud)
但是我发现即使我在模板中浏览文件并单击"提交",它也总是会引发错误"字段不存在".我在这里有点困惑.field.data不是检查文件名是否存在的正确方法
我正在使用Flask与Flask-WTForms,我正在编写一个管理页面,可以更新用户的值 - 包括密码.
我正在使用我用于注册的相同表单页面,但由于不必更新密码,我不想要它.使用Flask-WTForms进行此操作的正确方法是什么?
我已经进入UserForm了forms.py,我正在考虑制作一个自定义验证器,并且有一个文件级require_password选项可以覆盖默认检查.我是WTForms的新手,对Flask来说有点新鲜.
我想要使用Flask的"SubmitField"
<button type="submit" title="Save this form"><span>Save</span></button>
Run Code Online (Sandbox Code Playgroud)
代替:
<input type="submit" title="Save this form" />
Run Code Online (Sandbox Code Playgroud)
我在模板中打印出来:
{{ field(class=css_class, title=field.description, **kwargs) }}
Run Code Online (Sandbox Code Playgroud)
我猜我必须以某种方式修改SubmitInput(SubmitField背后的小部件),但我不确定如何做到这一点,我是否必须修改__html __()?
编辑:
from flask.ext.wtf import Required, Length, EqualTo, Field, TextInput
from flask import Markup
class InlineButtonWidget(object):
html = """
<button type="submit" title="%s"><span>%s</span></button>
"""
def __init__(self, input_type='submit'):
self.input_type = input_type
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
kwargs.setdefault('type', self.input_type)
if 'value' not in kwargs:
kwargs['value'] = field._value()
return HTMLString(self.html % (field.name, field.label ))
class InlineButton(Field):
widget = InlineButtonWidget()
def _value(self):
if self.data: …Run Code Online (Sandbox Code Playgroud) 我用以下方式定义了一个表单:
class LoginForm(Form):
login = EmailField(u'Email address', [required(), length(min=5, max=2048), validators.Email()])
password = PasswordField(u'Password', [required(), length(min=6, max=50)])
next = HiddenField()
remember = BooleanField('Remember me')
submit = SubmitField('Login')
Run Code Online (Sandbox Code Playgroud)
然后我在Jinja2中编写一个通用宏来渲染表单字段,我想做的事情如下:
{% if field.is_required() %}
{{ field.label(class_='required') }}
{% else %}
{{ field.label() }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
那么......有没有办法看看是否需要一个字段?
当我使用wtf_forms和Flask-WTF创建表单并使用IntegerField输入时,我不能将它与Length验证器结合使用
如果我删除长度限制,那么它工作正常.当然我应该能够对IntegerField应用长度验证吗?
Python代码.
from flask_wtf import Form
from wtforms import TextField, PasswordField, IntegerField, validators
class RegistrationForm(Form):
firstname = TextField('First Name', [validators.Required()])
lastname = TextField('Last Name', [validators.Required()])
telephone = IntegerField('Telephone', [validators.Length(min=10, max=10, message="Telephone should be 10 digits (no spaces)")])
TypeError
TypeError: object of type 'int' has no len()
Traceback (most recent call last)
File "C:\Python27\lib\site-packages\flask\app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
class ChangeOfficialForm(Form):
is_official = SelectField(
'Officially Approved',
choices=[(True, 'Yes'), (False, 'No')],
validators=[DataRequired()],
coerce=bool
)
submit = SubmitField('Update status')
Run Code Online (Sandbox Code Playgroud)
出于某种原因,is_official.data总是如此True.我怀疑我误解了胁迫是如何起作用的.
我正在尝试使用Bootstrap-CSS和水平显示单选按钮Flask-WTForms.据我所知,我需要使用Bootstrap类class_="radio-inline"来实现这一目标.我试过了,我得到的就是这个:
其中,单选按钮是垂直组织的,令人沮丧.
Flask WTForm代码:
from flask.ext.wtf import Form
import csv
import os
import buildHome as bh
from wtforms import TextField, RadioField, TextAreaField, SubmitField, validators, BooleanField
class ContactForm(Form):
firstName = TextField("First name", [validators.Required("Please enter your first name.")])
lastName = TextField("Last name", [validators.Required("Please enter your last name.")])
#name = TextField("Name", [validators.Required("Please enter your name.")])
email = TextField("Email", [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])
node_1 = BooleanField("Joan Johnson (Buckridge Inc)")
direction_1 = RadioField('', …Run Code Online (Sandbox Code Playgroud) 我想在表单中使用电话号码字段.我需要的是在Android手机上点击此字段,而不是普通键盘,但仅显示数字.
我了解到这可以通过使用<input type="tel"或实现<input type="number".
如何在WTForms中使用tel或number输入类型?
到目前为止,我的流程是使用WTF表单并根据用户活动更新其状态:
在我的template.html中,我有:
<form action="{{ url_for('page') }}" method="POST">
<select id="sel_id" name="name1" onchange="this.form.submit();">
...
</select>
</form>
Run Code Online (Sandbox Code Playgroud)
......在views.py中我得到了:
@app.route('/')
@app.route('/process', methods=['GET', 'POST'])
def process():
form = NoNameForm()
if request.method == 'POST':
if 'name1' in request.form:
form.colors = int(request.form['name1'])
Run Code Online (Sandbox Code Playgroud)
这是使用WTF表单和更新变量的正确方法,例如form.colors在这种情况下吗?我想知道我是否可以form.colors直接在" onchange"js代码中更新.
我正在尝试使用FlaskForms将userID变量传递给WTForms.首先,我将展示工作正常的代码,然后我需要修改的代码(我不知道如何部分).我正在添加与某个组关联的新名称.
FlaskForm模型:
class AddName(FlaskForm):
name =StringField('Device name', validators=[InputRequired(),Length(min=4, max=30)])
groupID = SelectField('Payload Type', choices=[(1,"Group1"),(2,"Group2")], validators=[InputRequired])
Run Code Online (Sandbox Code Playgroud)
查看型号:
@app.route('/dashboard/addname', methods=['GET', 'POST'])
def addname():
form=AddName()
if form.validate_on_submit():
name=Name(form.name.data,form.groupID.data)
db.session.add(name)
db.session.commit()
return "New name added"
Run Code Online (Sandbox Code Playgroud)
模板:
<form method="POST" action="/dashboard/addname">
<h2>Add name</h2>
{{ form.hidden_tag() }}
{{ wtf.form_field(form.name) }}
{{ wtf.form_field(form.groupID) }}
<button type="submit">Add name</button>
</form>
Run Code Online (Sandbox Code Playgroud)
我在下拉列表中看到了正确的列表,并在提交时给出了正确的数字.
任务:我需要根据current_user.userID传递不同的列表.我正在使用SQLAlchemy构建列表,通过从DB中的表进行查询,因此My Flask视图是:
@app.route('/dashboard/addname', methods=['GET', 'POST'])
def addname():
available_groups=db.session.query(Groups).filter(Groups.userID == currend_user.userID).all()
#Now forming the list of tuples, so it's ok for SelectField
groups_list=[(i.groupID, i.groupName) for i in …Run Code Online (Sandbox Code Playgroud)