我在WTForms库中遇到了一个奇怪的问题.对于测试,我创建了一个包含单个字段的表单:
class ArticleForm(Form):
content = TextField('Content')
Run Code Online (Sandbox Code Playgroud)
它接收一个简单的字符串作为内容,现在我使用form.validate()它,它会False因任何原因返回.
我看着validate()的方法'Form和Field对象.我发现如果错误列表的长度为零,则该字段返回true.这对我的测试来说是正确的,因为我没有得到任何错误.在shell中,我的字段验证按预期返回True.
validate()Form对象中的方法只是在字段上运行并调用它们的validate()方法,只有在其中一个字段被验证为false时才返回false.
因此,我的Field在没有任何错误的情况下得到验证,我无法在代码中看到任何原因form.validate()返回False.
有任何想法吗?
我的博客发表于......
http://www.seanbradley.biz/blog
......完全没有格式化.它们只是一大块明文.任何代码或HTML标记,例如/ n或<br /> ...更不用说h1,h2等......对文本在页面上的显示方式没有明显影响.
我正在使用部署在GAE上的WTForms运行Flask.我怎样才能解决这个问题?有没有办法在新的博客文章条目的表单字段中实现WYSGIWYG编辑器(如TinyMCE)?
我想要看起来像......一样简单优雅
要么
...或者至少类似于Stackoverflow自己的编辑器.
格式化在发布时在上述所有帖子中呈现(而不是通过编辑器的grody overblown工具栏).
我不确定在我的帖子中禁止HTML标签的呈现是否与WTForms中的类的自定义有关,或者必须在GAE的数据存储中专门处理的内容,或者我需要在Flask中修复的内容(例如,模型为帖子).关于我 - 作为一个相对初级的开发者 - 可以将格式化到这些博客文章中的任何明确解决方案都能获得丰厚的回报.来自以下应用的具体代码......
注意:还有一个Flask-Markdown扩展,但我同样不确定如何集成它以实现我想要的效果.
我在Google App Engine上运行Flask(当然还有Jinja模板/ Werkzeug路由),并且对于如何将WYSIWYG编辑器集成到我专门用于博客帖子的页面感到困惑...
我假设,如果合并TinyMCE,JavaScript的调用将放在模板的标题中......就像这样:
<script type="text/javascript" src="/static/js/tiny_mce/tiny_mce.js">
Run Code Online (Sandbox Code Playgroud)
<textarea cols="80" rows="10" id="articleContent" name="articleContent">
<h1>Article Title</h1>
<p>Here's some sample text</p>
</textarea>
<script type="text/javascript">
tinyMCE.init({
theme : "advanced",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
mode : "exact",
elements : "articleContent"
});
</script>
Run Code Online (Sandbox Code Playgroud)
<label for="title">{{ form.title.label }}</label>
{{ form.title|safe }}
{% …Run Code Online (Sandbox Code Playgroud) 我有一个Flask应用程序,它使用WTForms进行用户输入.它使用SelectMultipleField一种形式.我似乎无法让应用程序在选中时在字段中发布所有项目; 它只发送选择的第一个项目,无论用户选择了多少.
该瓶的文件说,这大约从这个字段类型发送的数据,但我没有看到这种行为:
SelectMultipleField上的数据存储为对象列表,每个对象都从表单输入中检查和强制.
这是一个完整的,最小的Flask应用程序,说明了这一点:
#!/usr/bin/env python
from flask import Flask, render_template_string, request
from wtforms import Form, SelectMultipleField
application = app = Flask('wsgi')
class LanguageForm(Form):
language = SelectMultipleField(u'Programming Language', choices=[('cpp', 'C++'), ('py', 'Python'), ('text', 'Plain Text')])
template_form = """
{% block content %}
<h1>Set Language</h1>
<form method="POST" action="/">
<div>{{ form.language.label }} {{ form.language(rows=3, multiple=True) }}</div>
<button type="submit" class="btn">Submit</button>
</form>
{% endblock %}
"""
completed_template = """
{% block content %}
<h1>Language Selected</h1>
<div>{{ language }}</div>
{% …Run Code Online (Sandbox Code Playgroud) 我正在尝试刷新WTForm验证错误.我找到了这个片段并略微修改了它:
def flash_errors(form):
"""Flashes form errors"""
for field, errors in form.errors.items():
for error in errors:
flash(u"Error in the %s field - %s" % (
getattr(form, field).label.text,
error
), 'error')
Run Code Online (Sandbox Code Playgroud)
这是我的一个表单类:
class ContactForm(Form):
"""Contact form"""
# pylint: disable=W0232
# pylint: disable=R0903
name = TextField(label="Name", validators=[Length(max=35), Required()])
email = EmailField(label="Email address",
validators=[Length(min=6, max=120), Email()])
message = TextAreaField(label="Message",
validators=[Length(max=1000), Required()])
recaptcha = RecaptchaField()
Run Code Online (Sandbox Code Playgroud)
并查看:
@app.route("/contact/", methods=("GET", "POST"))
def contact():
"""Contact view"""
form = ContactForm()
flash_errors(form)
if form.validate_on_submit():
sender = "%s <%s>" …Run Code Online (Sandbox Code Playgroud) 我正在使用Flask,mongoengine进行项目,我正在尝试从http://docs.mongodb.org/manual/tutorial/write-a-tumblelog-application-with-flask-mongoengine/获取基本的东西.
从上面的链接实现了所有内容后,我在Post中为"tags"添加了一个新字段,当我尝试创建帖子时,我的标签没有显示输入框.
任何帮助表示赞赏.
我的代码如下
class Post(db.Document):
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
title = db.StringField(max_length=255, required=True)
slug = db.StringField(max_length=255, required=True)
body = db.StringField(required=True)
views = db.IntField(default=0)
category = db.StringField()
tags = db.ListField(db.StringField(max_length=30))
Run Code Online (Sandbox Code Playgroud)
模板
{% macro render(form) -%}
<fieldset>
{% for field in form %}
{% if field.type in ['CSRFTokenField', 'HiddenField'] %}
{{ field() }}
{% else %}
<div class="clearfix {% if field.errors %}error{% endif %}">
{{ field.label }}
<div class="input">
{% if field.type == 'ListField' %}
{% for subfield in …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解决了容易.
我正试图在我的一个烧瓶视图中实现Select2字段.基本上我想在烧瓶应用程序视图中使用相同的select2字段(不是烧瓶管理模型视图),就像在Flask-admin模型创建视图中一样.目前我的解决方案QuerySelectField来自于看起来像这样的wtforms
class TestForm(Form):
name= QuerySelectField(query_factory=lambda: models.User.query.all())
Run Code Online (Sandbox Code Playgroud)
这让我加载和选择我需要的所有数据,但它不提供选择2搜索框等.目前,所有我发现是Select2Field和Select2Widget从瓶/管理/表格/域和瓶/管理/表格/部件同样像这篇文章/sf/ask/1725147231/ 以及http://ivaynberg.github.io/select2/上的 select2文档
据我了解这些可以重复使用,这意味着不需要其他自定义小部件,自定义字段.
如果有人可以提供有关在应用程序中的select2字段实现的更多信息(包括视图,模板,表单文件以及如何正确地"连接"必要的js和css文件,以及如何使用数据库模型加载字段,将不胜感激需要).
当使用动态选项验证时,我得到一个难以理解的错误消息(其中一个选择字段中的选项取决于其他选择字段中的选项.但是,一旦选择了某个区域,我就无法选择一个城市.为什么不呢?必须是什么做了什么?
for city in montaomodel.City.all().fetch(99999): # TODO: only do this for the region
try:
form.area.choices.insert(long(city.key().id()),
(str(city.key().id()), 'Select...'))
except:
pass
Run Code Online (Sandbox Code Playgroud)
我的整个插入和验证代码块如下.
class AdLister(BaseRequestHandler,
blobstore_handlers.BlobstoreUploadHandler):
csrf_protect = False
def post(self):
logging.info("i post")
ad = Ad()
if users.get_current_user():
ad.user = users.get_current_user()
if self.current_user is not None:
try:
ad.usr = self.current_user
except Exception, e:
logging.info('exception %s' % str(e))
logging.info("i post2")
if self.request.get('type'):
ad.type = self.request.get('type')
if self.request.get('address'):
ad.address = self.request.get('address')
if self.request.get('rooms'):
ad.number_of_rooms = int(self.request.get('rooms'))
if self.request.get('size'):
ad.size = float(self.request.get('size'))
if self.request.get('regdate'):
ad.regdate = …Run Code Online (Sandbox Code Playgroud) 由于某种原因,我需要在里面声明一个字段,__init__()所以我可以制作任意类型的FormField.
举个例子form.py:
class PurchaseForm(Form):
item_class = ItemForm
transaction_items = FieldList(FormField(item_class),
label='items',
min_entries=1)
def __init__(self, item_class, *args, **kwargs):
super().__init__(*args, **kwargs)
self.item_class = item_class
self.transaction_items = FieldList(FormField(self.item_class),
label='items',
min_entries=1)
Run Code Online (Sandbox Code Playgroud)
如果我这样做,该transaction_items字段不会被替换__init__(),我可以做一些事情来覆盖它吗?或者setattr为这个特定的例子做些什么?
编辑:这是我如何指定构造函数
import form
@app.route('/add/purchase-transaction', methods=['GET', 'POST'])
def add_purchase_transaction():
form = forms.PurchaseForm(form.ItemForm)
if form.validate_on_submit():
# do something
return render_template('add-purchase-transaction.html', form=form)
Run Code Online (Sandbox Code Playgroud)
所以我的目标是做一个PurchaseForm具有FieldList包含ItemForm窗体类,并在将来,我可以换ItemForm到不同的类,例如PurchaseItemForm
我有一个空的选择字段,其中包含我在运行时定义的选项:
myfield = SelectField('myfield', validators=[Optional()])
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用看起来像这样的GET请求:
@app.route('/', methods=['GET'])
def myresponse():
form = myform(csrf_enabled=False)
form.myfield.choices = (('', ''), ('apples', 'apples'), ('pears', 'pears'))
Run Code Online (Sandbox Code Playgroud)
然后当我尝试在空表格上验证时.(我没有GET参数去myapp.com)
if not form.validate():
return search_with_no_parameters()
else:
return search_with_parameters(form) #this gets run
Run Code Online (Sandbox Code Playgroud)
当我的search_with_parameters函数尝试使用表单变量时,它会检查以确保它form.myfield.data不是Falsey(不是空字符串).如果它不是Falsey,则使用该参数进行搜索.如果为Falsey,则忽略该参数.但是,在空表单提交时,form.myfield.data是"None"一个字符串."None"完成搜索.我可以验证"None"字符串,但我认为这首先打败了使用该模块的目的.有没有办法让它只返回一个空字符串或真正的None值?
wtforms ×10
python ×8
flask ×5
jinja2 ×2
flask-admin ×1
mongoengine ×1
python-2.7 ×1
tinymce ×1
web ×1
werkzeug ×1