这是我在StackOverflow上的第一篇文章,大家好.
我正在做博客应用程序来学习Python和Flask,我想在Google App Engine上启动它.不幸的是,我将WTForms导入应用程序时遇到了小问题.我目前正在使用Flask 0.9,WTForms 1.0.1和Flask-WTForms 0.8.我已经将flaskext_wtf文件夹添加到我的项目的根路径,但是我从html5.py文件中收到错误.
File "/Users/lucas/Workspace/blog/flask_wtf/html5.py", line 1, in <module>
from wtforms import TextField
File "/Users/lucas/Workspace/blog/flask/exthook.py", line 86, in load_module
raise ImportError('No module named %s' % fullname)
ImportError: No module named flask.ext.wtf.wtforms
Run Code Online (Sandbox Code Playgroud)
看起来它试图在扩展路径中找到wtforms而不是我的项目路径.如何通知html5.py文件在根目录中查找wtforms?
以下是我项目的来源 - https://bitbucket.org/lucas_mendelowski/wblog/src
我正在使用Flask-WFT文档页面 上显示的render_field宏来跨不同模板呈现长格式的字段.
字段定义如下
year_built = IntegerField(label='Year Built',
description='Year built, not the year of a major renovation.',
validators=[validators.NumberRange(
min=1700,
max=2012,
message="Between %(min)s and %(max)s")])
Run Code Online (Sandbox Code Playgroud)
宏看起来像这样......
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
在表单本身中,各个字段使用...
{{ render_field(form.year_built, class="input text")}}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是一种在创建HTML字段的宏部分内的字段对象中使用描述的方法field(**kwargs).我知道我可以将关键字传递给render_field函数,但我正在处理包含100多个字段的表单,并在forms.py中设置描述,然后再次将其设置为template.html中的title关键字,这似乎是不必要的补充.我真的想使用宏来显示描述作为标题,如果它在那里或只显示没有标题的字段,如果不是.
有没有办法kwargs在field()函数运行之前添加新条目?
我想使用WTForms在表格中呈现表单.似乎TableWidget可以解决这个问题,但是我能让它工作的唯一方法如下:
from wtforms import Form, TextField, widgets
class User(Form):
user = TextField('User')
email = TextField('Password')
widget = widgets.TableWidget(with_table_tag=False)
user = User()
print user.widget(user)
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪(print user.widget(user)部分)根据文档,我应该能够说:
class User(Form):
user = TextField('User', widget=widgets.TableWidget)
email = TextField('Password', widget=widgets.TableWidget)
user = User()
for form_field in user:
print form_field
Run Code Online (Sandbox Code Playgroud)
但是,这会回来 TypeError: __str__ returned non-string (type TableWidget)
当我替换用户时,发送电子邮件至:
user = TextField('User')
email = TextField('Password')
Run Code Online (Sandbox Code Playgroud)
当然,WTForms渲染按预期工作.
这是如何运作的?
我是第一次使用WTForms.使用WTForms在Tornado中验证POST请求下面是我的表单forms.py
class UserForm(Form):
user = TextField('user', [validators.Length(min=23, max=23)])
Run Code Online (Sandbox Code Playgroud)
在tonado处理程序中我有
def post(self):
form = UserForm(self.request.body)
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是:formdata应该是一个支持'getlist'方法的multidict类型包装器"
我怎么能做这个工作?
这是一个关于使用的问题wtforms SelectField.
提交表单后,我希望提取所选文本.
我有以下表格:
from wtforms import Form, SelectField
class TestForm(Form):
hour = SelectField(u'Hour', choices=[('1', '8am'), ('2', '10am') ])
Run Code Online (Sandbox Code Playgroud)
这是观点:
@app.route('/', methods=['GET', 'POST'])
def test_create():
form =TestForm(request.form)
if request.method == 'POST' and form.validate():
test = Test()
form.populate_obj(test)
test.hour=form.hour.name
db.session.add(test)
db.session.commit()
return redirect(url_for('test_create'))
return render_template('test/edit.html', form=form)
Run Code Online (Sandbox Code Playgroud)
随着test.hour=form.hour.name我获得属性name(毫不奇怪......),同时我需要文本(假设8am选择了第一个选项).
这怎么可能?谢谢你的任何提示.
我有一个包含姓名和图片的表格
MyForm的:
name = TextField(
u'name',
validators=[
validators.DataRequired(),
validators.Length(min=1, max=25)
]
)
pictures = FileField(
u'pictures',
validators=[
FileRequired(),
FileAllowed(['jpg', 'png'], 'Images only!')
]
)
Run Code Online (Sandbox Code Playgroud)
Jinja2模板:
{% from "_form_helpers.tpl" import render_field %}
<form method="post" action="" enctype="multipart/form-data">
<dl>
{{ render_field(form.name) }}
{{ render_field(form.pictures) }}
</dl>
<p>{{ form.submit }}
</form>
Run Code Online (Sandbox Code Playgroud)
我想在一个字段中上传一个或多个图片(多选).
这该怎么做?
谢谢..
我正在阅读http://pythonhosted.org/WTForms/,但它没有定义过滤器函数的接口,如Field()构造函数的filters = keyword参数.在其他地方,它表示.filter属性是一个可调用的列表.那么呼叫序列是什么?是否需要一个参数并返回过滤后的值?如果参数无效,它是否应该引发一些异常,如果是,那么什么异常?
我刚刚开始使用Flask进行编码,我想在我的应用程序中的小表单上设置CSRF.我正在关注此http://wtforms.readthedocs.org/en/2.0.2/csrf.html以进行基于会话的实施.我在网上浏览了一段时间以找到类似问题的解决方案,但我没有成功,如果这是一个重复的问题,请道歉.
这段代码的问题:
当我在虚拟环境中运行它时,我得到以下堆栈跟踪AttributeError: 'Request' object has no attribute 'POST'-
目标:在wtform实例上实现csrf
环境:wtf版本2.02,烧瓶0.10,venv与python 2.7
from flask import session, request
from flask.ext.wtf import Form
from wtforms import TextField, validators, SubmitField
from wtforms.validators import Required, Length
from wtforms.csrf.session import SessionCSRF
from datetime import timedelta
import config # my config file
# create super class
class MyForm(Form):
class Meta:
csrf = True
csrf_class = SessionCSRF
csrf_secret = config.secret_key
csrf_time_limit = timedelta(minutes=20)
@property
def csrf_context(self):
return request.session
# create a …Run Code Online (Sandbox Code Playgroud) 好.我知道这已经被解决了很多次,但我找不到一个有用的javascript示例的答案.
说我有这个表格:
class MyForm(Form):
category = SelectField("Category")
issue = SelectField("Issue")
Run Code Online (Sandbox Code Playgroud)
我需要的是在运行时在"类别"中选择的任何内容,以确定用户在问题下拉列表中看到的内容,而没有任何类型的POST.我知道如何从数据库查询中动态创建视图中的选项.我甚至已经根据类别选择创建了"问题选择"字典.
我只是不能为我的生活找出我需要的JavaScript,以便从类别下拉菜单中选择一些东西确定问题下拉列表中的什么.
我正在尝试制作一个生成以下HTML的烧瓶形式:
<input type="text" name="title" class="field">
<textarea class="field"></textarea>
<select name="status">
<option value="active">Active</option>
<option value="inactive">Inactive</option>
</select>
Run Code Online (Sandbox Code Playgroud)
到目前为止,因为我是python的新手,所以我做到了这一点.
{% from "forms/macros.html" import render_field %}
<form method="POST" action="." class="form">
{{ render_field(form.title, class="input text") }}
Run Code Online (Sandbox Code Playgroud)
我的问题是,到目前为止我对标题字段是否正确,并假设我有,请有人请解释我如何获得textarea和selectfield?我已经阅读了文档,我发现几乎无法理解它.