如果选中复选框,我正在使用自定义验证器来检查字段是否为空.它检查正确,但无论它是否总是在验证值是否为数字.
基本上我需要一个字段来停止在表单的某些条件下进行验证.
有没有办法让自定义验证器停止对该字段的验证?
我有一个动态网页,应该处理两种形式:登录表单和注册表单.我正在使用WTForms来处理这两种形式,但是我在使它工作时遇到了一些麻烦,因为两种形式都被渲染到同一页面.
以下是我的网页登录表单的代码:
PYTHON:
class Login(Form):
login_user = TextField('Username', [validators.Required()])
login_pass = PasswordField('Password', [validators.Required()])
@application.route('/index', methods=('GET', 'POST'))
def index():
l_form = Login(request.form, prefix="login-form")
if request.method == 'POST' and l_form.validate():
check_login = cursor.execute("SELECT * FROM users WHERE username = '%s' AND pwd = '%s'"
% (l_form.login_user.data, hashlib.sha1(l_form.login_pass.data).hexdigest()))
if check_login == True:
conn.commit()
return redirect(url_for('me'))
return render_template('index.html', lform=l_form)
HTML:
<form name="lform" method="post" action="/index">
{{ lform.login_user }}
{{ lform.login_pass }}
<input type="submit" value="Login" />
</form>
Run Code Online (Sandbox Code Playgroud)
以下是我的网页注册表格的代码: …
这是我的HTML下拉菜单.该值是子表的主键.
<select id="category" name="category">
<option selected value="__None"></option>
<option value="1">Category Number One</option>
<option value="2">Category Number Two</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我需要使用值整数1而不是"类别编号一"更新Post.category_id.这是我的代码.
# create new post
@app.route('/admin/post', methods=['GET', 'POST'])
@login_required # Required for Flask-Security
def create_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title=form.title.data,
body=form.body.data,
pub_date=form.pub_date.data,
cateogry_id=form.category.data)
db.session.add(post)
db.session.commit()
flash('Your post has been published.')
return redirect(url_for('admin'))
posts = Post.query.all()
return render_template('create_post.html', form=form, posts=posts)
Run Code Online (Sandbox Code Playgroud)
我试过制作......
cateogry_id=form.category.data
cateogry_id=form.category.value
Run Code Online (Sandbox Code Playgroud)
现在不是那么好!
我通过Flask-WTF非常简化的wiki阅读,并且无法理解我能用它做什么.我的印象是<form>html 的部分现在只能看起来像
<form method="post">
{{ form.hidden_tag() }}
{{ form.name }}
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
但我真的想要使用物化的样式,例如:
<div class="row">
<div class="input-field col s6">
<i class="material-icons prefix">account_circle</i>
<input value="FN" id="first_name" type="text" class="validate">
<label class="active" for="first_name">First Name</label>
</div>
<div class="input-field col s6">
<input value="LN" id="last_name" type="text" class="validate">
<label class="active" for="last_name">Last Name</label>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我在哪里能适应{{ form.first_name }}并{{ form.last_name }}进入?
编辑:让我详细说明我的答案:例如,我想要像Materialized datepicker(一个很好的弹出日历,让用户选择日期),这应该在<input class='datepicker' length="50">,但现在我正在替换整<input>行与{{ form.date }}...我失去了编辑课程的特权,但没有.
有问题的代码:
from flask import Blueprint, render_template, abort
from flask.ext.wtf import Form
import os
from jinja2 import TemplateNotFound
from models import Member
from wtforms.ext.sqlalchemy.orm import model_form
@simple_page.route('/register')
def register():
form = model_form(Member, Form)
return render_template('register.html', form=form, name="bad")
class Member(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(50), nullable=False, unique=True)
Run Code Online (Sandbox Code Playgroud)
在我看来:
<p class="txt11 colorb">
{{ form.name }}
</p>
Run Code Online (Sandbox Code Playgroud)
这个输出<UnboundField(TextField, (), {u'default': None, u'filters': [], u'validators': [<wtforms.validators.Required object at 0x7f62f59b5590>, <wtforms.validators.Length object at 0x7f62f59b55d0>]})>,而不是实际的领域.如何使用wtform获得实际的表单/字段?
我正在尝试生成一个动态复选框列表,其中根据数据状态检查某些框.
这是我的表格:
class FooForm(Form):
bar = SelectMultipleField(
'Bar',
option_widget=CheckboxInput(),
widget=ListWidget(prefix_label=True))
Run Code Online (Sandbox Code Playgroud)
这是控制器:
@app.route('/fooform', methods = ['GET','POST'])
def foo():
foos = foo_dao.find()
form = FooForm()
form.bar.choices = [(foo.id, foo.label) for foo in foos]
# SOMEHOW PRE-POPULATE CHECKBOXES HERE
if form.is_submitted():
# DO STUFF
return render_template('foo.html',
foos=foos,
form=form)
Run Code Online (Sandbox Code Playgroud)
这是模板:
<form action="" method="post" name="foos">
{{form.bar}}
<p><input type="submit" value="Add"></p>
</form>
Run Code Online (Sandbox Code Playgroud)
这会生成一个复选框列表,但它可以工作,但我无法弄清楚如何指定列表中的哪些复选框要预先填充.
我在WTForms表格中有这个字段
name = StringField('Name', validators = [Optional(), Length(max = 100)])
Run Code Online (Sandbox Code Playgroud)
当字段提交为空form.name.data时,将按预期包含空字符串.
有没有办法让它返回None而不是空字符串?这只是因为null在数据库中处理非常方便,如下所示update:
update t
set
name = coalesce(%(name)s, name),
other = coalesce(%(other)s, other)
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我不需要检查字段是否为空,并在SQL代码中的Python代码中采取相应的操作.在null与coalesce解决了容易.
我正在尝试创建一个SelectField或SelectMultipleField允许我为其<option>标签添加属性.我试图添加像data-id或其他的属性data-____.我无法弄清楚如何做到这一点,因为它似乎只能为<select>标签本身而不是选项添加属性.
最终结果应该是这样的:
<select id="regularstuff-here" name="regular-name-here">
<option value="1" data-id="somedata here" >Some Name here</option>
<option value="2" data-id="somedata here" >Some Name here</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我假设我必须创建一个自定义小部件.如果我查看WTForms的源代码,我会看到该select小部件调用:
html.append(self.render_option(val, label, selected))
Run Code Online (Sandbox Code Playgroud)
如果我看一下这个方法:
@classmethod
def render_option(cls, value, label, selected, **kwargs):
options = dict(kwargs, value=value)
if selected:
options['selected'] = True
return HTMLString('<option %s>%s</option>' % (html_params(**options),
escape(text_type(label))))
Run Code Online (Sandbox Code Playgroud)
因此,似乎您不能将任何额外的参数传递给呈现option标记的方法.
我正在尝试使用Jinja2模板为SQLAlchemy应用程序创建一个简单的基于WTForms的管理界面。
我已经阅读了WTForms-Alchemy的文档,并且我了解它可以通过几行代码从我的模型自动生成表单,例如:
class UserForm(ModelForm):
class Meta:
model = User
Run Code Online (Sandbox Code Playgroud)
我的问题是,即使我自动生成了此表单,也找不到任何有关如何将其转换为功能HTML页面的资源。有一些有关字段呈现错误的摘要,还有一些SO答案提到了用于呈现整个字段的宏,但是我发现关于如何自动生成完整的功能形式的资源绝对没有。
//我知道这是Flask-Admin可能已经做的事情,我没有使用Flask,因此不幸的是这是不可能的。
这是我尝试过的:
nrkomp = IntegerField('Number',validators=[NumberRange(min=1, max=5, message='Invalid length')])
Run Code Online (Sandbox Code Playgroud)
在开发人员工具中,此表单输入类型为文本而不是数字,我已阅读文档,但找不到解决此问题的方法。