标签: wtforms

WTForms:在编写自定义验证时传递额外的参数

为wtforms编写自定义验证时,是否可以传递额外的参数(例如request)

例如

class MyForm(Form):
  name = TextField('Name', [Required()])

  def validate_name(form, field):
    if len(field.data) > 50:
        raise ValidationError('Name must be less than 50 characters')
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我需要传递请求对象(或非表单对象)。有什么办法吗?

python wtforms

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

Flask,MongoEngine,WTForms-表单呈现错误

我有以下模型:

class Post(Document):
    body = db.StringField(required=True)
    author = db.StringField(verbose_name="Author", max_length=255, required=True)
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
    comments = db.ListField(db.EmbeddedDocumentField('Comment'))
Run Code Online (Sandbox Code Playgroud)

和下面的视图:

from flask.ext.mongoengine.wtf import model_form

@app.route('/')
def home():
    form = model_form(Post, exclude=('created_at', 'comments'))
    return render_template('home.html', form=form)
Run Code Online (Sandbox Code Playgroud)

我不知道如何在模板中呈现此表单。我确实尝试了几件事:

{% for field in form %}
    {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:

TypeError: 'FormMeta' object is not iterable
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

{{ form.body() }}
Run Code Online (Sandbox Code Playgroud)

有不同的错误:

AttributeError: 'UnboundField' object has no attribute '__call__'
Run Code Online (Sandbox Code Playgroud)

和{{form.body}}这样的渲染

<UnboundField(TextAreaField, (), {'default': None, 'validators': [<wtforms.validators.Required object at 0x7f63804d0fd0>], 'description': '', 'filters': [], …
Run Code Online (Sandbox Code Playgroud)

mongoengine flask wtforms

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

动态字段取决于WTForms的先前字段

我正在使用WTForms制作表格.目前,我有这个:

class UploadForm(flask_wtf.Form):
    fichier = wtforms.fields.FileField(u'Fichier')
    description = wtforms.fields.TextAreaField(u'Description')
    year = wtforms.fields.SelectField(u'Année', choices=[('1A','1A'),('2A','2A')])
    subject = wtforms.fields.SelectField(u'Matière', choices=app.config['SUBJECTS'])
    submit = wtforms.fields.SubmitField(u'Envoyer')
Run Code Online (Sandbox Code Playgroud)

使用SUBJECTS = [('Sub1','Sub1'), ('Sub2','Sub2')]和此模板:

{% block content %}
  <h2>Form</h2>
  <form action="{{ url_for('get') }}" method="post"
          enctype="multipart/form-data">
    {{ form.hidden_tag() }}

    {{ form.fichier.label }}
    {{ form.fichier }}

    {{ form.description.label }}
    {{ form.description }}

    {{ form.year.label }}
    {{ form.year }}

    {{ form.subject.label }}
    {{ form.subject }}

    {{ form.submit }}
  </form>
{% endblock %} 
Run Code Online (Sandbox Code Playgroud)

但是这些年来的主题并不相同,所以我想让主题领域的列表动态化,以便仅提出与所选年份相对应的主题.知道我怎么能这样做吗?

python flask wtforms

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

WTForms相当于Go?

我目前正在开发一个使用Flask,WTForms,SQLAlchemy和相应的Flask扩展的应用程序来将它们粘合在一起.我正考虑将来搬到Go,因为原因.Go中是否有任何库允许我将Web表单映射到模型并以与WTForms相同的方式进行参数化验证?

sqlalchemy go wtforms

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

从会话数据中填充选择选项的正确方法是什么?

我在用户登录时在会话中存储一些变量,以便稍后用于填充字段.

from flask_wtf import Form
from wtforms import SelectField
from flask import session

class InstitutionForm(Form):

    city = session['city']

    city_tuples = [(x, x) for x in city]

    organisation = SelectField(
        'organisation',
        choices=city_tuples
    )


class Institution(View):

    methods = ['POST']

    def dispatch_request(self):

        form = InstitutionForm()
        return render_template(
            'form/institution.html',
            form=form)
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,我得到错误'在请求上下文之外工作'.从会话数据填充此字段的正确方法是什么?

python session flask wtforms

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

从模型瓶,sqlalchamey和wtforms创建表单

我收到这个错误,我不确定我做错了什么.我创建了表单,就像我从互联网上获得的那样.我按照这个例子https://wtforms-alchemy.readthedocs.org/en/latest/introduction.html#quickstart

class User(db.Model):
    __tablename__= 'users'

    DRIVER = 'driver'
    ADMIN = 'admin'

    username = db.Column('username', db.String(80), primary_key=True)
    _pw_hash = db.Column('pw_hash', db.String(128), nullable=False)
    _pw_salt = db.Column('pw_salt', db.String(20), nullable=False)
    first_name = db.Column('full_name', db.String(100), nullable=False)
    last_name = db.Column('last_name', db.String(100), nullable=False)
    email = db.Column('email', db.String(120))
    phone = db.Column('phone', db.String(20))
    #acct_type = db.Column('acct_type', db.Enum(DRIVER, ADMIN), nullable=False)

    def check_pw(self, pw):
        return self._pw_hash == util.pwhash(pw, self._pw_salt)

    @property
    def _pw_hash(self):
        return self._pw_hash

    @_pw_hash.setter
    def password(self, pw):
        self._pw_salt = util.salt(20)
        self._pw_hash = util.pwhash(pw, self._pw_salt)


    def __init__(self, un, pw, first, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask wtforms

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

将WTForms字段标签与字符串进行比较总是返回False

如果字段标签为“登录”,则我不想仅显示输入本身。但是field.label,将宏中的“登录”与“登录”进行比较始终是错误的,因为<p>hello</p>永远不会呈现。如何将标签与字符串进行比较?

{% macro render_field(field) %}
  {%if field.label == "Log-in" %}
    <p>hello</p>
  {%else%}
    {{ field.label }} {{ field(**kwargs)|safe }}
  {%endif%}
{% endmacro %}

<div id = "SignUpForm">
    <form action = "" method = "post" name = "SignUpForm">
        <p>{{render_field(form.username)}}</p>
        <p>{{render_field(form.first_name)}}</p>
        <p>{{render_field(form.last_name)}}</p>
        <p>{{render_field(form.password)}}</p>
        <p>{{render_field(form.password2)}}</p>
        <p>{{form.submit}}</p>
        {{form.hidden_tag()}}
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-wtforms

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

TypeError:__ init __()得到一个意外的关键字参数'password'

我无法找出导致此错误的原因

TypeError: __init__() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

这是指向

@user_blueprint.route('/login', methods=['GET', 'POST'])
def login():
    if g.user.is_authenticated:
        flash("You are already Logged in", 'warning')
        return redirect(url_for('members'))
    error = ""
    form = LoginForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            user = User.query.filter_by(username=form.username.data).first()
            if user is not None and bcrypt.check_password_hash(user.password, form.password.data):
                login_user(user, remember=form.remember.data)
                flash('You are sucessfuly Logged in', 'success')
                return redirect(url_for('members'))
            else:
                error = "You have entered an incorrect username and password"
    return render_template("front/login.html", forms=form, error=error)
Run Code Online (Sandbox Code Playgroud)

LoginForm如下所示:

class LoginForm(Form):
    username …
Run Code Online (Sandbox Code Playgroud)

flask wtforms flask-sqlalchemy flask-login flask-wtforms

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

如何在使用flask-wtf和flask-bootstrap时将html属性传递给wtf.form_field

我在使用flask-bootstrap宏呈现的模板中有一些表单:

{% import 'bootstrap/wtf.html' as wtf %}
{{ wtf.form_field(form.name) }}
Run Code Online (Sandbox Code Playgroud)

但我也想这样做:

{{ form.name(class="form-control", placeholder='Name', maxlength=20, size=20) }}
Run Code Online (Sandbox Code Playgroud)

我怎么可能将html属性传递给form_field函数?我知道Field类构造render_kw函数中的参数wtfforms,但我想在模板中设置属性而不是在python代码中设置属性!也许你可以告诉我一些很酷的模式flask-wtfflask-bootstrap(或只是bootstrap)或只是回答我的问题:)谢谢!

python flask wtforms twitter-bootstrap

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

WTForms相当于<input type ="time">

我正在为使用wtforms的烧瓶构建一个webapp(一个教育项目),我遇到了以下问题:我需要能够以开始时间和结束时间的形式收集用户的输入,我认为这是html5

input type="time"
Run Code Online (Sandbox Code Playgroud)

会是完美的,但是我在wtforms文档中找不到相应的东西.谷歌搜索问题也没有产生任何解决方案.似乎最接近的是DateTimeLocalField,但我不想存储/显示日期信息.作为一种解决方法,我可能只使用2个SelectFields,一个用于小时,一个用于分钟,但也许我错过了一些明显的东西.有没有办法让DateTime(Local)字段只显示时间,或者用wtforms创建一个'TimeField'?

python flask wtforms

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