提交后如何从 WTForms 表单中获取数据?我想获取在表单中输入的电子邮件。
class ApplicationForm(Form):
email = StringField()
@app.route('/', methods=['GET', 'POST'])
def index():
form = ApplicationForm()
if form.validate_on_submit():
return redirect('index')
return render_template('index.html', form=form)
Run Code Online (Sandbox Code Playgroud)
class ApplicationForm(Form):
email = StringField()
@app.route('/', methods=['GET', 'POST'])
def index():
form = ApplicationForm()
if form.validate_on_submit():
return redirect('index')
return render_template('index.html', form=form)
Run Code Online (Sandbox Code Playgroud) 我有一个水果表单,其中有一个香蕉的FieldList对象:
bananas = FieldList(FormField(BananaForm))
Run Code Online (Sandbox Code Playgroud)
在前端,最初,我将其中一个字段添加到FieldList
form.append_entry()
Run Code Online (Sandbox Code Playgroud)
现在使用Javascript我设法创建函数,可以动态添加(加按钮)或删除(减去按钮)可以填充信息的BananaForm字段的数量.
FielstList会自动为其所有字段创建ID.所以要使用js动态添加,我复制HTML代码并设置字段id + = 1,如:
第一场:
<tr>
<td><input id="bananas-0-originCountry" type="text" /></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
带有+ = 1的重复字段:
<tr>
<td><input id="bananas-1-originCountry" type="text" /></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
当我这样相应地命名并提交表单时,WTForms将自动识别后端中添加的字段(工作正常).
到目前为止一切都很好,但这是我的问题:要使表单有效,我必须为每个WTForm添加CSRF字段.在Jinja模板中,我这样做:
{{ form.hidden_tag() }}
Run Code Online (Sandbox Code Playgroud)
但是,当我只使用我的js函数复制HTML时,我缺少CSRF字段(因为在提交之前,后端表单对象不知道添加的FormFields).那么如何动态生成这些CSRF字段呢?(一个Ajax请求?如果是,怎么样?)
这应该是表格和烧瓶的标准用例.我希望我的描述是可以理解的,如果没有,请告诉我.任何帮助赞赏!
更新:这是我的代码
JS-功能
function addBanana(){
// clone and insert banana node
var node = document.getElementById("fruitTable");
var trs = node.getElementsByTagName("tr");
var tr = trs[trs.length-2];
var tr2 = tr.cloneNode(true);
tr.parentNode.insertBefore(tr2, tr);
// in order to increment label and input field ids
function plusone(str){
return str.replace(
new RegExp("-(\\d+)-", "gi"),
function($0, …Run Code Online (Sandbox Code Playgroud) 我使用Python和webapp2构建了一个多语言Web应用程序.
我有一个名为Tag的对象,它有多种语言的翻译.出于这个原因,我创建了以下模型:
class Language(ndb.Model):
code = ndb.StringProperty()
name = ndb.StringProperty(indexed=False)
class MultilingualText(ndb.Model):
language = ndb.KeyProperty(kind=Language)
text = ndb.TextProperty(indexed=False)
class Tag(ndb.Model):
translations = ndb.StructuredProperty(MultilingualText, repeated=True, indexed=False)
Run Code Online (Sandbox Code Playgroud)
我想问一下这是否是执行此类任务的正确方法,以及如何将此结构与WTForms一起用于验证等.
非常感谢提前!
Flask-WTF's documentation states that:
Flask-WTF provides you a FileField to handle file uploading, it will automatically draw data from flask.request.files if the form is posted. The data attribute of FileField will be an instance of Werkzeug FileStorage.
但是,当我使用时FileField,data发布后的属性不是FileStorage对象.相反,它是None(如果我enctype="multipart/form-data"按照文档中的建议定义我的表单)或文件名作为字符串(如果我没有定义enctype).
这是相关的Jinja2模板:
{% from "_form.html" import render_field %}
{% block body %}
<section class="page-width-container" id="offset-content">
<div id="utility-box">
<h1 class="utility-header">Settings</h1>
{{ message }}
<form action="/settings" method="post" enctype="multipart/form-data">
{{ render_field(form.photo) }}
<input type="submit" …Run Code Online (Sandbox Code Playgroud) 我做了一个带有两个日期字段的表单的小型Flask应用程序,这就是我填充值的方法:
class BoringForm(Form):
until = DateTimeField("Until",
format="%Y-%m-%dT%H:%M:%S",
default=datetime.today(),
validators=[validators.DataRequired()])
Run Code Online (Sandbox Code Playgroud)
但是,这只生成一次,服务器端,这意味着明天我仍然会得到昨天的日期.我尝试传递obj=something给构造函数,其中something有一个OrderedDict带有调用的键since,但它没有用.想法?
我想在验证后重置表单.目前,表单在提交并有效后仍会显示以前的数据.基本上,我希望表单恢复到原始状态,所有字段都清理干净.这样做的正确性是什么?
@mod.route('/', methods=['GET', 'POST'])
def home():
form = NewRegistration()
if form.validate_on_submit():
#save in db
flash(gettext(u'Thanks for the registration.'))
return render_template("users/registration.html", form=form)
Run Code Online (Sandbox Code Playgroud) 我有一个flask + wtforms应用程序,我希望用户能够输入父对象和任意数量的子对象。我不确定从用户界面动态创建新的子表单输入字段的最佳方法是什么。
以下是一个完整的工作示例。(注意:这是一个人工示例,用于突出显示单个.py文件中的所有工作部件,这使代码有些混乱。很抱歉。)
from flask import Flask, render_template_string
from flask_wtf import FlaskForm
from wtforms import FieldList, FormField, StringField, SubmitField
from wtforms.validators import InputRequired
# Here I'm defining a parent form, AuthorForm, and a child form, BookForm.
# I'm using the FieldList and FormField features of WTForms to allow for multiple
# nested child forms (BookForms) to be attached to the parent (AuthorForm).
class BookForm(FlaskForm):
title = StringField('title', validators=[InputRequired()])
genre = StringField('genre', validators=[InputRequired()])
# I'm defining a min_entry of …Run Code Online (Sandbox Code Playgroud) 是否可以在WTForms内部使用HTML5中使用的一些新属性属性?
例如,假设您要使用占位符="foo",必需和自动聚焦属性创建TextField.如何在WTForms中完成?
在HTML中它看起来像这样: <input maxlength="256" name="q" value="" placeholder="foo" autofocus required>
请注意,placeholder="foo"在WTForms中很容易完成.autofocus并且required,因为它们没有价值,所以......好吧,就我所见,在WTForms中不受支持.
WTForms可以支持吗?
我正在使用WTForms并且我正在尝试显示SelectField,但是我收到以下错误:
>>> form.status()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\Lib\site-packages\wtforms\fields.py", line 136, in __call__
return self.widget(self, **kwargs)
File "C:\Python26\Lib\site-packages\wtforms\widgets.py", line 237, in __call__
for val, label, selected in field.iter_choices():
File "C:\Python26\Lib\site-packages\wtforms\fields.py", line 390, in iter_choices
for value, label in self.choices:
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
这是我的表格:
class TestForm(Form):
status = SelectField(u'Status', choices=Test.statuses())
Run Code Online (Sandbox Code Playgroud)
该Test.statuses静态方法返回一个字符串列表.我究竟做错了什么?
我已经能够实现此更改以创建在WTForms中禁用的Field.在渲染之前,如何有选择地禁用视图中的字段?
wtforms ×10
python ×9
flask ×7
javascript ×2
csrf ×1
forms ×1
jinja2 ×1
python-2.7 ×1
validation ×1
webapp2 ×1