标签: wtforms

WTForms不验证 - 没有错误

我在WTForms库中遇到了一个奇怪的问题.对于测试,我创建了一个包含单个字段的表单:

class ArticleForm(Form):
    content = TextField('Content')
Run Code Online (Sandbox Code Playgroud)

它接收一个简单的字符串作为内容,现在我使用form.validate()它,它会False因任何原因返回.

我看着validate()的方法'FormField对象.我发现如果错误列表的长度为零,则该字段返回true.这对我的测试来说是正确的,因为我没有得到任何错误.在shell中,我的字段验证按预期返回True.

validate()Form对象中的方法只是在字段上运行并调用它们的validate()方法,只有在其中一个字段被验证为false时才返回false.

因此,我的Field在没有任何错误的情况下得到验证,我无法在代码中看到任何原因form.validate()返回False.

有任何想法吗?

python wtforms

7
推荐指数
1
解决办法
4037
查看次数

在Flask/WTForms/Google App Engine中格式化博客文章

这是简短的问题:

我的博客发表于......

http://www.seanbradley.biz/blog

......完全没有格式化.它们只是一大块明文.任何代码或HTML标记,例如/ n或<br /> ...更不用说h1,h2等......对文本在页面上的显示方式没有明显影响.

我正在使用部署在GAE上的WTForms运行Flask.我怎样才能解决这个问题?有没有办法在新的博客文章条目的表单字段中实现WYSGIWYG编辑器(如TinyMCE)?

我想要看起来像......一样简单优雅

http://www.quietwrite.com

要么

http://lucumr.pocoo.org/

...或者至少类似于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)



但是,那么 - 因为,本身,模板或渲染页面本身没有 ,它不仅仅是 --TinyMCE的安装文档 - 也是在模板中添加以下代码块的问题......

<textarea cols="80" rows="10" id="articleContent" name="articleContent">
  &lt;h1&gt;Article Title&lt;/h1&gt;
  &lt;p&gt;Here's some sample text&lt;/p&gt;
</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)

tinymce werkzeug jinja2 flask wtforms

7
推荐指数
1
解决办法
3218
查看次数

使用带有SelectMultipleField的WTForms的Flask应用程序

我有一个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)

python jinja2 flask wtforms

7
推荐指数
1
解决办法
9690
查看次数

Flask-WTFform:Flash不显示错误

我正在尝试刷新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)

python flask wtforms

7
推荐指数
1
解决办法
5428
查看次数

麻烦在mongoengine上渲染listfield model_form

我正在使用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)

python mongoengine flask wtforms flask-mongoengine

7
推荐指数
1
解决办法
724
查看次数

从Fields数据中获取None而不是空字符串

我在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代码中采取相应的操作.在nullcoalesce解决了容易.

python wtforms flask-wtforms

7
推荐指数
1
解决办法
4143
查看次数

在flask/flask-admin中选择2字段实现

我正试图在我的一个烧瓶视图中实现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搜索框等.目前,所有我发现是Select2FieldSelect2Widget从瓶/管理/表格/域和瓶/管理/表格/部件同样像这篇文章/sf/ask/1725147231/ 以及http://ivaynberg.github.io/select2/上的 select2文档 据我了解这些可以重复使用,这意味着不需要其他自定义小部件,自定义字段.

如果有人可以提供有关在应用程序中的select2字段实现的更多信息(包括视图,模板,表单文件以及如何正确地"连接"必要的js和css文件,以及如何使用数据库模型加载字段,将不胜感激需要).

python flask wtforms flask-wtforms flask-admin

7
推荐指数
1
解决办法
5311
查看次数

在对一个字段使用wtform验证时,"不是一个有效的选择"是什么意思?

当使用动态选项验证时,我得到一个难以理解的错误消息(其中一个选择字段中的选项取决于其他选择字段中的选项.但是,一旦选择了某个区域,我就无法选择一个城市.为什么不呢?必须是什么做了什么?

 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)

python python-2.7 wtforms web

7
推荐指数
1
解决办法
887
查看次数

我可以在__init__ wtforms中添加字段吗?

由于某种原因,我需要在里面声明一个字段,__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

python wtforms flask-wtforms

7
推荐指数
1
解决办法
2767
查看次数

Flask-WTF动态选择字段将"无"作为字符串

我有一个空的选择字段,其中包含我在运行时定义的选项:

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 flask-wtforms

7
推荐指数
2
解决办法
3234
查看次数