在为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)
如果可能的话,我需要传递请求对象(或非表单对象)。有什么办法吗?
我有以下模型:
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) 我正在使用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)
但是这些年来的主题并不相同,所以我想让主题领域的列表动态化,以便仅提出与所选年份相对应的主题.知道我怎么能这样做吗?
我目前正在开发一个使用Flask,WTForms,SQLAlchemy和相应的Flask扩展的应用程序来将它们粘合在一起.我正考虑将来搬到Go,因为原因.Go中是否有任何库允许我将Web表单映射到模型并以与WTForms相同的方式进行参数化验证?
我在用户登录时在会话中存储一些变量,以便稍后用于填充字段.
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)
当我运行应用程序时,我得到错误'在请求上下文之外工作'.从会话数据填充此字段的正确方法是什么?
我收到这个错误,我不确定我做错了什么.我创建了表单,就像我从互联网上获得的那样.我按照这个例子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) 如果字段标签为“登录”,则我不想仅显示输入本身。但是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) 我无法找出导致此错误的原因
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-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-wtf和flask-bootstrap(或只是bootstrap)或只是回答我的问题:)谢谢!
我正在为使用wtforms的烧瓶构建一个webapp(一个教育项目),我遇到了以下问题:我需要能够以开始时间和结束时间的形式收集用户的输入,我认为这是html5
input type="time"
Run Code Online (Sandbox Code Playgroud)
会是完美的,但是我在wtforms文档中找不到相应的东西.谷歌搜索问题也没有产生任何解决方案.似乎最接近的是DateTimeLocalField,但我不想存储/显示日期信息.作为一种解决方法,我可能只使用2个SelectFields,一个用于小时,一个用于分钟,但也许我错过了一些明显的东西.有没有办法让DateTime(Local)字段只显示时间,或者用wtforms创建一个'TimeField'?