如果我在构建字段期间设置默认值,则一切都会按预期工作:
my_field = StringField("My Field: ", default="default value", validators=[Optional(), Length(0, 255)])
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试以编程方式设置它,则没有任何效果。我尝试过修改__init__方法,如下所示:
class MyForm(FlaskForm):
my_field = StringField("My Field: ", validators=[Optional(), Length(0, 255)])
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.my_field.default = "set default from init" # doesn't work
Run Code Online (Sandbox Code Playgroud)
这不会设置默认值。我如何以编程方式执行此操作(因为该值是基于数据库查询的动态值,如果我在外部执行此操作__init__,则它不会获得最新值)?
我的相关版本requirements.txt:
Flask==0.12
Flask-WTF==0.14.2
WTForms==2.1
Run Code Online (Sandbox Code Playgroud)
另外,如果重要的话,我正在运行 Python 3.6。
或者,我很满意一个解决方案,该解决方案使我能够在添加新记录时在初始表单加载时设置此字段的值数据(与构造函数中指定的默认值相同的行为),但同样的表单也用于编辑,因此我不希望它更改已在编辑时保存/存储的对象数据。
我看到同样奇怪的行为发布到Filling WTForms FormField FieldList with data results in HTML in fields,其中我的原始字段使用 HTML 而不是默认值呈现。在另一个示例中,FieldList 基本上在单个 FormField 上进行了一层深度堆叠。就我而言,我在 FormField 上的 FieldList 上创建 FieldList 的 2D 结构。我不知道我在哪里。
应用程序.py
import os
from flask import Flask, redirect, render_template, request, send_file, url_for
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms import FieldList, FormField, RadioField, TextAreaField, validators
app = Flask(__name__)
csrf = CSRFProtect(app)
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
#region FORMS
class TestCaseItem(FlaskForm) :
pass_fail_radio = RadioField( '' , choices=[('Pass','Pass'), ('Fail','Fail')] , default='Pass' …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 WTForms 颜色输入字段。
这就是我定义表单的方式:
from wtforms.widgets.html5 import ColorInput
class ColoursForm(Form):
background_color = ColorInput()
Run Code Online (Sandbox Code Playgroud)
这是视图:
@app.route("/colours/<token>/", methods=['GET', 'POST'])
def edit_colours(token):
form = ColoursForm(request.form)
if request.method == 'GET':
return render_template('colours_edit.html', form=form, token=token)
else: # Request = post
return redirect(url_for('view_scoreboard', token=token))
Run Code Online (Sandbox Code Playgroud)
在我的 Jinja2 模板 (colours_edit.html) 中,我这样做:
<p> {{ form.background_color }} Pick a color here </p>
Run Code Online (Sandbox Code Playgroud)
但是,它没有按预期渲染 HTML 颜色选择器,而是在渲染的 HTML 中看到了这一点:
<wtforms.widgets.html5.ColorInput 对象位于 0x10b836e90> 在此处选择颜色
为什么输入没有被渲染?
我正试图在没有太多运气的情况下使用带有webapp的WTForms.
我希望能够使用form_fieldtemplatetag,如文档中所示:
{% form_field form.username class="big_text" onclick="do_something()" %}
我已经在我的应用程序中安装了WTForms,但是它的Django模板标签对我不起作用.有没有人有关于如何安装这个的说明?
如果我不能正常工作,我可能会放弃并切换到Jinja2模板.到目前为止我们与Django保持一致的原因是尽可能地限制依赖的数量.
这是我到目前为止所尝试的:
我在本地安装了Django 1.1并根据文档启用了它.
我尝试添加INSTALLED_APPS = ['wtforms.ext.django']到我的settings.py- 没有效果.
我尝试手动注册wtforms templatetag:
register = webapp.template.create_template_register()
from wtforms.ext.django.templatetags import wtforms
register.tag('form_field', wtforms.do_form_field)
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误: InvalidTemplateLibrary: Could not load template library from template_helpers, No module named django.templatetags
所以我尝试将模板标签复制并粘贴到我自己的代码中,我得到了错误TemplateSyntaxError: Could not parse the remainder: ' form.foobar' from 'form_field form.foobar.
但是,我不认为模板标签注册有效,因为没有该代码,错误是相同的.
更新:我要离开这个问题以防万一有人在互联网上有一天可以回答它,但我切换到Jinja2现在一切正常.使用Django模板的Webapp对我来说已经死了.;-)
我正在使用继承WTForms.我上了下课:
class MyForm(WTForms):
...
def process(self, formdata=formdata, obj=None):
super(self.__class__, self).process(formdata=formdata, obj=obj)
Run Code Online (Sandbox Code Playgroud)
我有错误(并非总是,但在某些情况下有类似的形式 - 它更奇怪):
Maximum recursion depth have been exceeded
但是当我改变了self.__class__→ MyForm一切都还好!
我不明白......据我所知,他们必须是同义词.怎么了?
该烧瓶安全文档提到的所有重要观点端点的JSON/Ajax支持.因此,通过使用JSON对象命中视图,可以获得所有buts-in Flask-Security非常棒的功能.
但是,现在我正在尝试将其用作RESTful API的一部分,并且它不起作用,因为它需要一个CSRF令牌,这对于网页是必需的,但对于API则不需要:
{
"meta": {
"code": 400
},
"response": {
"errors": {
"csrf_token": [
"CSRF token missing"
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?
我创建了以下表单:
class ContentForm(Form):
content = StringField(u'write here' , validators=[Required()])
submit = SubmitField(u'Let them know' )
Run Code Online (Sandbox Code Playgroud)
当我提交时,事情似乎有效.但是,当我之后刷新页面时,表单会再次提交.我该如何解决?
我想创建一个SelectField基于当前日期提供不同选择的自定义。例如,如果是每月的13号,则选择的值将是1到13。我该如何做?
def register_extensions(app):
security.init_app(app, datastore=ds, register_form=forms.ExtendedRegisterForm)
class ExtendedRegisterForm(RegisterForm):
pay_month = SelectField(choices=[('need', 'custom'), ('day', 'choices')])
Run Code Online (Sandbox Code Playgroud) 我是Flask和WTForms的新手,我无法渲染我的HTML页面.我一次又一次地浏览了WTforms文档,但是我找不到错误的来源:
jinja2.exceptions.UndefinedError, UndefinedError: 'form' is undefined
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
forms.py
from flask.ext.wtf import Form
from wtforms import TextField, BooleanField, TextAreaField, StringField, PasswordField, SelectField, validators
class LoginForm(Form):
username = TextField('Username', [
validators.Required(),
validators.Length(min=4, max=25)
])
password = PasswordField('New Password', [
validators.Required()
])
Run Code Online (Sandbox Code Playgroud)
app.py
from forms import *
from wtforms import Form, fields, BooleanField, TextField, StringField, PasswordField, validators
from werkzeug.security import generate_password_hash, \
check_password_hash
@app.route('/login/', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form)
if request.method == 'POST' and form.validate():
if load_user(form.username.data) is None:
flash('Invalid username') …Run Code Online (Sandbox Code Playgroud) 我有以下代码,我正在提交表格.当我点击提交按钮时,我的表单验证打印出来False.我已经检查并确保我包含了不同帖子中的所有内容,但我无法让它验证.有什么我做错了吗?
@app.route('/index.html', methods=['GET', 'POST'])
def index():
user = {'nickname': 'Rafa'}
form = FilterForm()
print("about to validate", file=sys.stderr)
if form.validate_on_submit():
print("validated", file=sys.stderr)
filters_array = form.filter.split(',')
streaming(filters_array)
response = {"response", "yes"}
redirect("/authenticate")
return render_template('index.html',
title="Home",
user=user,
form=form)
class FilterForm(Form):
filter = StringField('filter', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)
这是我的Jinja文件
{% block content %}
<h1> I have successfully navigated to the title pagee </h1>
<h1> Hello, {{user.nickname}}!</h1>
<h1> Get Tweets </h1>
<p> Please enter a comma delimited list of filters</p>
<form action="" method="post" name="login">
{{form.filter(size=80)}}
<input …Run Code Online (Sandbox Code Playgroud)