标签: flask-wtforms

通过解析yaml文件创建表单

我有一个yaml文件如下

name:
    property_type: string
    mandatory: True
    default: None
    help: your full name

address:
    city:
        property_type: string
        mandatory: True
        default: None
        help: city

    state:
        property_type: string
        mandatory: True
        default: None
        help: state
Run Code Online (Sandbox Code Playgroud)

我想要做的是解析此文件以创建一个表单类(可由 Django 或 WT-Forms 使用)来创建 Web 表单。

我不能简单地创建类,因为只要更新 yaml 配置文件,表单(以及类)就需要自动更新。

我目前正在尝试使用 pyyaml 来完成此任务。在此先感谢您的帮助。

django pyyaml wtforms flask-wtforms

2
推荐指数
1
解决办法
4064
查看次数

Jinja/Wtform aria-required 验证

我有一个前端,它通过一个简单的宏生成引导程序表单:

{% macro render_field(field, class_='', label_visible=true) -%}

<div class="form-group {% if field.errors %} has-error {% endif %}">
    {% if (field.type != 'HiddenField' and field.type !='CSRFTokenField') and label_visible %}
        <label for="{{ field.id }}" class="control-label">{{ field.label }}</label>
    {% endif %}
    {{ field(class_='form-control', **kwargs) }}
    {% if field.errors %}
        {% for e in field.errors %}
            <p class="help-block">{{ e }}</p>
        {% endfor %}
    {% endif %}
</div>

{%- endmacro %}
Run Code Online (Sandbox Code Playgroud)

我使用的 wtform 如下所示:

class CommentForm(Form):
    comment = TextAreaField(validators=[DataRequired('Please enter your comment.')])
Run Code Online (Sandbox Code Playgroud)

是否可以为aria-required="true"具有作为验证器的字段添加前端验证 …

jinja2 wtforms flask-wtforms twitter-bootstrap-3

2
推荐指数
1
解决办法
697
查看次数

将自定义对象传递给 WTForm

我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示:

我的初始化:

form = EditEventForm(event)
Run Code Online (Sandbox Code Playgroud)

还有我的表单类:

class EditEventForm(FlaskForm):
    def __init__(self, event):
        self.event = event

    name = StringField('Name', validators=[DataRequired()],     default=self.event.name)
    description = TextAreaField('Description', validators=[DataRequired()], default=self.event.description)
    street = StringField('Street and number', validators=[DataRequired()], default=self.event.street)
    city = StringField('City', validators=[DataRequired()], default=self.event.city)
    time = StringField('Time', validators=[DataRequired()], default=self.event.time)
Run Code Online (Sandbox Code Playgroud)

但显然,表单无法访问自上下文。有没有另一种方法可以实现它,以便我的字段可以从传递的对象中读取数据?

python flask python-3.x wtforms flask-wtforms

2
推荐指数
1
解决办法
2720
查看次数

带 BooleanField 的 Flask WTForms FieldList

我想生成带有复选框的文件列表。我尝试使用 FieldList 但它没有按我预期的那样工作。我得到的不是带有指定文件名的复选框,而是带有以包含 FieldList 对象的变量命名的标签的复选框。有什么办法可以解决吗?

应用程序.py:

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import BooleanField, FieldList, SubmitField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'development'
Bootstrap(app)

filenames = ['1.jpg', '2.jpg', '3.jpg', '4.jpg']


class FileListForm(FlaskForm):
    filename = FieldList(BooleanField(), 'Files')
    submit = SubmitField('Submit')


@app.route('/')
def listfiles():
    form = FileListForm()
    for filename in filenames:
        form.filename.append_entry(filename)
    return render_template('index.html',
                           form=form)


if __name__ == '__main__':
    app.run(debug=True, port=5001)
Run Code Online (Sandbox Code Playgroud)

模板/index.html

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
Run Code Online (Sandbox Code Playgroud)

包:

click==6.7
dominate==2.3.1 …
Run Code Online (Sandbox Code Playgroud)

python flask python-3.x flask-wtforms

2
推荐指数
1
解决办法
2524
查看次数

自定义 Flask-WTF 或 WTForms

我正在尝试将 Flask 集成为我正在使用的 UI 的后端。

不幸的是,UI 已经为表单设置了 CSS 和 JavaScript(以适应 UI,也适应旧版本的 IE 和其他情况)。

我遇到的第一个问题是字段已经有标签。如果我在模板中使用.labels属性:

{{ form.username.label }}
Run Code Online (Sandbox Code Playgroud)

然后它创建一个额外的标签,我似乎无法为 CSS/JavaScript 添加任何属性。但是,如果我关闭.label属性,则会在用户名输入上方创建一个额外的空白文本字段。

我的forms.py文件中的代码是:

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)

我在这方面遗漏了什么吗?

第二部分是向表单本身添加属性。我已经找到了如何使用class_='classname'添加 HTML属性,但是 Flask-WTF 和 WTForms 文档似乎没有涉及任何其他属性(例如autcomplete="off"placholder="username"

有没有什么方法可以用我所缺少的 Flask-WTF 或 WTForms 来完成这个任务?对于此类功能,我是否仅限于手动属性和/或 Jinja 宏?我无法想象 WTForms 和 Flask-WTF 会缺少这一点,但我也没有看到文档或 Google/StackOverflow 上的任何地方提到它。

谢谢!

python flask wtforms flask-wtforms

2
推荐指数
1
解决办法
2742
查看次数

我可以在字段构造函数之外设置 StringField 的默认值吗?

如果我在构建字段期间设置默认值,则一切都会按预期工作:

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。

或者,我很满意一个解决方案,该解决方案使我能够在添加新记录时在初始表单加载时设置此字段的值数据(与构造函数中指定的默认值相同的行为),但同样的表单也用于编辑,因此我不希望它更改已在编辑时保存/存储的对象数据。

python flask wtforms flask-wtforms python-3.6

2
推荐指数
1
解决办法
5288
查看次数

烧瓶 wtforms-alchemy QuerySelectField ValueError:解压的值太多(预期为 2)

我正在尝试使用flask-wtfwtforms-alchemy 在此表单上创建注册表单我尝试创建selectfield,其值是从我的模型中查询的。但我总是收到这个错误:

 ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)

这是我的代码

from flask_wtf import FlaskForm
from wtforms_sqlalchemy.fields import QuerySelectField

def choose_domicile():
    return Domicile.query

class RegisterForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    domicile = QuerySelectField(u'Domicile', query_factory=choose_domicile)


@app.route('/signup', methods=['GET', 'POST'])
    def signup():
        form = RegisterFormView()
        try:
            if form.validate_on_submit():
                new_user = Data(name=form.name.data, domicile=form.domicile.data)
                db.session.add(new_user)
                db.session.commit()
                return "Success"
        except:
            return "Failed"

        return render_template('signup.html', form=form)
Run Code Online (Sandbox Code Playgroud)

这是我的signup.html

{% block content %}
<div class="container">

  <form class="form-signin" method="POST" action="/signup">
    <h2 class="form-signin-heading">Sign Up</h2>
    {{ …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy flask-wtforms

2
推荐指数
1
解决办法
1036
查看次数

嵌套 WTForms FieldList 在字段中生成 HTML

我看到同样奇怪的行为发布到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)

python fieldlist flask wtforms flask-wtforms

2
推荐指数
1
解决办法
2052
查看次数

在同一页面上烧瓶多个表单

我的 Flask 应用程序遇到了问题,基本上我在同一个 html 页面中有两个表单,当我提交一个或另一个表单时,它会同时提交这两个表单。有什么方法可以以某种方式将它们分开,以便我可以单独提交它们吗?

@app.route('/smtp/', methods=['GET', 'POST'])
def smtp():
    form = UpdateSMTPForm()
    form2 = UpdateEmailAddress()
    query = Email.query.all()

    if  form.validate_on_submit():
        email = str(form.email.data)
        password = str(form.password.data)
        server = str(form.server.data)
        port = str(form.port.data)

        if tools.test_email(server, port, email, password):
            CONFIG['SMTP']['server'] = server
            CONFIG['SMTP']['port'] = port
            CONFIG['SMTP']['username'] = email
            CONFIG['SMTP']['password'] = password

            with open('config.json', 'w') as f:
                f.write(json.dumps(CONFIG))
                f.close()
        else:
            form.server.errors.append("Invalid account, be sure that you have less secure app access turned on or try with a gmail account")


    if form2.validate_on_submit():
        print('form2 …
Run Code Online (Sandbox Code Playgroud)

html python forms flask flask-wtforms

2
推荐指数
1
解决办法
7027
查看次数

错误:“TypeError:hidden_​​tag() 缺少 1 个必需的位置参数:‘self’”,在 Flask 中,python

我一直在创建一个基于论坛的学习系统,类似于评估项目的堆栈溢出。我对烧瓶相当陌生,但是我相信我对 python 有很好的了解。我一直在关注Corey Schafer 的Flask 教程并将它们调整到我的项目中。每当我尝试访问名为“adduser”的页面(一个带有用于添加用户的表单的网页)时,我都会收到错误消息:

"TypeError: hidden_tag() missing 1 required positional argument: 'self'".

我不知道这意味着什么,也不知道如何尝试修复它。我假设我可能会在“adduser”页面的 HTML 中找到修复程序,在删除'{{ form.hidden_tag() }}'标记后,我得到了一个不同的错误,这让我相信该错误与'forms.py'文件和'addUser.html'文件有关。

表格.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from itroom.models import User

class LoginForm(FlaskForm):
    email = StringField('Email',validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember = BooleanField('Remember Me')
    submit = SubmitField('Login')

class AddUserForm(FlaskForm):
    email = StringField('Email',validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = …
Run Code Online (Sandbox Code Playgroud)

html python flask flask-wtforms

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