标签: wtforms

WTForms 中的可选但非空字段

可选验证器允许空值和该值不存在的情况(来自文档

类 wtforms.validators.Optional(strip_whitespace=True)

允许空输入并停止验证链继续。

如果输入为空,还会从字段中删除先前的错误(例如处理错误)。

我在一个字段上有一些额外的验证器,我希望即使输入是空字符串,这些验证器也能运行。如果输入是空字符串,内置Optional验证器将跳过其余验证器。是否有内置或任何其他方式来实现这一目标?

编辑:有关我的用例的更多细节

我正在使用此表单来验证PUT请求。假设我有一个用户实体,其中usernames 作为 ID,middlenames 作为可选字段。那么字段的验证器将类似于:

class UserUpdateForm(Form):
    username = fields.StringField('username', [
        validators.Optional(),
        validators.Length(min=5, max=500)
    ])
    middlename = fields.StringField('middlename', [
        validators.Optional()
    ])
Run Code Online (Sandbox Code Playgroud)

因此,我将允许PUT没有usernamemiddlename参数的请求,并且这些请求将使字段保持不变。但是,当参数存在并且是空字符串时,我希望username字段验证由于Length验证器而失败,但我允许将该middlename字段设置为空字符串。

从另一个角度来看:我想区分不存在的参数和空字符串参数。

python validation wtforms

4
推荐指数
1
解决办法
4259
查看次数

WTForms-Javascript:将 onclick 传递到 WTF 字段

有没有办法将“onclick”传递到 WTForm 字段?我想根据是否选中 WTF 复选框来启用/禁用某个字段。但 WTForms 中的 HTML 不会创建或具有“onclick”参数。

我有一个表格:

class test(Form):
    checkbox=BooleanField('Checkbox')
    required=TextField('Required if checked')
Run Code Online (Sandbox Code Playgroud)

我有 JS:

function disablefld(){
  cb=document.getElementById('checkbox').checked;
  document.getElementById('required').disabled=!cb;
  }
Run Code Online (Sandbox Code Playgroud)

为该复选框生成的 HTML WTForms 为: <input id="checkbox" name="checkbox" type="checkbox" value="y">。它不起作用,因为onclick它不存在。

我已经尝试过checkbox=BooleanField('Checkbox', onclick="disablefld()"),但这是一个意想不到的争论。这是可能的还是我应该用纯 html 制作表单?

html javascript forms flask wtforms

4
推荐指数
1
解决办法
6184
查看次数

WTForms - 提交后 DateTimeLocalField 数据为 None

POST请求提交表单后,每个Field数据都有其值,除了DateTimeLocalField. 访问 DateTimeLocalField 的数据值是一种None.

形式

class ArticleForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    category = SelectField(u'Category', choices=categories.choices)
    town = StringField('Town', validators=[DataRequired()])
    minimal_price = IntegerField('Minimal price')
    article_image = FileField('Article_image', validators=[FileRequired()])
    time_left = DateTimeLocalField('Time to end', validators=[InputRequired()],
                              format='%Y-%m-%d %H:%M:%S')
    description = TextAreaField('Description', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)

验证:经测试is_submitted,除了所有的工作article_form.time_left.dataNone

if article_form.validate_on_submit():

    new_article = Article(name=article_form.name.data,
                          category=article_form.category.data,
                          town=article_form.town.data,
                          minimal_price=article_form.minimal_price.data,
                          article_image=name,
                          time_left=article_form.time_left.data, # <-- None
                          description=article_form.description.data,
                          user_id=current_user.id)
Run Code Online (Sandbox Code Playgroud)

任何帮助获取数据DateTimeLocalField

python forms flask wtforms

4
推荐指数
2
解决办法
2505
查看次数

如何验证 WTForms 中的 DateField

在我的烧瓶应用程序中,我有一个带有两个日期选择器的 WTForm,用于“开始日期”和“结束日期”。验证“结束日期”不早于“开始日期”的最佳方法是什么?

from flask_wtf import FlaskForm
from wtforms.fields.html5 import DateField
from wtforms import SubmitField 

class Form(FlaskForm):
    startdate_field = DateField('Start Date', format='%Y-%m-%d')
    enddate_field = DateField('End Date', format='%Y-%m-%d')
    submit_field = SubmitField('Simulate')
Run Code Online (Sandbox Code Playgroud)

我在这个主题上唯一发现的是这个验证器:

 wtforms_html5.DateRange
Run Code Online (Sandbox Code Playgroud)

在这里找到:https : //pypi.org/project/wtforms-html5/0.1.3/ 但它似乎是 wtforms-html5 的旧版本。

python flask wtforms

4
推荐指数
1
解决办法
4058
查看次数

Flask WTForm DateField 仅接受今天和未来日期

我有一个WT表单,需要前端侧输入数据。目前,该表单允许用户输入所有日期,但当我创建一个仅允许输入未来日期的网站时,我想为此添加一个验证器,以不允许过去的日期。

我已经看过以前的问题,但是它们并没有太大帮助。

以下是我的 forms.py 的一部分

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, DateField
from wtforms.validators import DataRequired
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from ..models import TasterDay, Course


class TasterDayForm(FlaskForm):
"""
Form for admin to add or edit a taster day
"""
name = StringField('Name', validators=[DataRequired()])
date = DateField('Date (DD-MM-YYYY)', format='%d-%m-%Y')
course = StringField('Course', validators=[DataRequired()])
lecturer = StringField('Lecturer', validators=[DataRequired()])
description = StringField('Description', validators=[DataRequired()])
submit = SubmitField('Submit')
Run Code Online (Sandbox Code Playgroud)

这是我的views.py 文件中的一部分,其中显示了一些路线。

from flask import abort, flash, redirect, render_template, url_for
from flask_login import current_user, …
Run Code Online (Sandbox Code Playgroud)

python validation flask wtforms flask-wtforms

4
推荐指数
1
解决办法
3219
查看次数

Flask WTForms 中不需要的电子邮件验证

我正在使用带有Flask的wtforms,并且有一个电子邮件输入框。我想验证电子邮件条目,但也将其作为非必填字段。用户可以忽略它,但如果他们输入它,我想确保它通过 wtforms 的电子邮件验证器。

理想情况下,我想要这样的东西:

email = StringField('Email', validators=[Email(), DataNotRequired()])
Run Code Online (Sandbox Code Playgroud)

或者

email = StringField('Email', validators=[Email(required=False)])
Run Code Online (Sandbox Code Playgroud)

我想使用 Flask-WTforms 实现这一目标的唯一可能方法是创建一个自定义 验证器。在这种情况下,有没有办法在我的自定义验证器中利用 Email() 验证器,这样我就不必重新实现它?

像这样的东西:

def validate_email(form, field):
    if len(field.data) > 0:
        if (not Email(field.data)):
            raise ValidationError('Email is invalid')
Run Code Online (Sandbox Code Playgroud)

python validation wtforms flask-wtforms

4
推荐指数
1
解决办法
1400
查看次数

validate_on_submit始终使用Flask WTForms返回false

我有一个简单的无线电字段,它总是导致validate_on_submit返回false.当我打印form.errors时,看起来"无效的选择"作为无线电字段中的值传递,尽管coerce = int.

我不认为我正在破坏表格中返回的任何东西,我希望以正确的方式创造动态选择.我不明白为什么会失败.

以下是我的项目的相关部分 - 任何建议表示赞赏.

forms.py:

class SelectRecord(Form):
    rid = RadioField("Record Select", choices=[], coerce=int,validators=[InputRequired()])
Run Code Online (Sandbox Code Playgroud)

views.py:

@mod.route('/select/', methods=('GET', 'POST'))
@login_required
def select_view():
    form = SelectRecord(request.form)
    if form.validate_on_submit():
        rid = form.data.rid
        if form['btn'] == "checkout":
            # check out the requested record
            Records.checkoutRecord(rid)
            return render_template('/records/edit.html',rid=rid)
        elif form['btn'] == "checkin":
            Records.checkinRecord(rid)
            flash("Record checked in.")
    else:
        mychoices = []
        recs_co = session.query(Records.id).filter(Records.editing_uid == current_user.id).  \
            filter(Records.locked == True)
        for x in recs_co:
            mychoices.append((x.rid,"%s: %s (%s)" % (x.a, x.b, x.c, x.d)))
        x = getNextRecord() …
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-sqlalchemy flask-wtforms

3
推荐指数
1
解决办法
5910
查看次数

如何从模型生成的表单中指定所需的小部件(例如TextArea而不是简单的Text输入)?烧瓶SQLAlchemy WTForms

我使用了http://flask.pocoo.org/snippets/60/中的代码片段,通过Flask中的模型创建了WTForms表单。除了仅创建输入字段的事实以外,其他所有方法都工作正常。我希望说明(请参见下面的models.py)成为文本区域。有任何想法吗?

从models.py:

title = db.Column(db.String(55))
description = db.Column(db.Text)
Run Code Online (Sandbox Code Playgroud)

从views.py

MyForm = model_form(MyModel, base_class=Form)
form = MyForm()
return render_template('create.html', form=form)
Run Code Online (Sandbox Code Playgroud)

来自create.html

{% for field in form %}
    {{field.label}}
    {{field}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

输出:

<input id="title" name="title" type="text" value="">
<input id="description" name="description" type="text" value="">
Run Code Online (Sandbox Code Playgroud)

我想要的是:

<input id="title" name="title" type="text" value="">
<textarea id="description" name="description"></textarea>
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-sqlalchemy flask-wtforms

3
推荐指数
1
解决办法
2817
查看次数

如何使用HiddenField强制WTForms中的整数数据?

我有一个WTForm这样的课:

class MyForm(Form):
    field1 = HiddenField(default=0, validators=NumberRange(min=0, max=20)])
Run Code Online (Sandbox Code Playgroud)

将此标记视为由.呈现 WTForms

<input type='hidden' name='field1' value='5'></input>
Run Code Online (Sandbox Code Playgroud)

这不通过NumberRange验证.这是因为HiddenFields widget类将该value属性强制转换为字符串.如何WTForms生成此标记,以便我可以在后续执行数字验证POST

python wtforms flask-wtforms

3
推荐指数
1
解决办法
2563
查看次数

WTForms - 将文本字段发布到数组

在常规HTML中,您可以将多个字段POST到数组:

<input type="text" name="arr[]">
<input type="text" name="arr[]">
<input type="text" name="arr[]">
<input type="text" name="arr[]">
Run Code Online (Sandbox Code Playgroud)

如何从WTForms获得此功能?基本上,我有一个用户的表单,然后单击小加号和减号按钮来添加或删除表单中的字段.

python flask wtforms

3
推荐指数
1
解决办法
2484
查看次数