我正在尝试制作一个生成以下HTML的烧瓶形式:
<input type="text" name="title" class="field">
<textarea class="field"></textarea>
<select name="status">
<option value="active">Active</option>
<option value="inactive">Inactive</option>
</select>
Run Code Online (Sandbox Code Playgroud)
到目前为止,因为我是python的新手,所以我做到了这一点.
{% from "forms/macros.html" import render_field %}
<form method="POST" action="." class="form">
{{ render_field(form.title, class="input text") }}
Run Code Online (Sandbox Code Playgroud)
我的问题是,到目前为止我对标题字段是否正确,并假设我有,请有人请解释我如何获得textarea和selectfield?我已经阅读了文档,我发现几乎无法理解它.
我使用 WTForms(与 Flask、flask-wtf、sqlalchemy 一起)来验证 REST API 传入的 JSON。我意识到 WTForms 的目标更多是 HTML 表单渲染和验证,但我选择它是因为它可以从我的 sqlalchemy 模型中自动生成表单(感谢 wtforms.ext.sqlalchemy)。
无论如何,问题就在这里。我的模型之一包括布尔字段,它使用 DataRequired 验证器转换为 wtforms.BooleanField。问题是,即使我传递了正确的数据,验证也会失败,并显示“此字段为必填项”错误消息。我的表格:
class MyForm(Form):
name = TextField('name', validators=[DataRequired()])
disabled = BooleanField('disabled', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)
JSON数据是这样的:
'{"name": "John", "disabled": "false"}'
Run Code Online (Sandbox Code Playgroud)
我期待什么:
{"disabled": "false"}-> 验证成功的强制 Python 数据:{'disabled': False}{"disabled": "true"}-> 验证成功的强制 Python 数据:{'disabled': True}{"disabled": ""}或'{"disabled": "foo"}'-> 验证失败目前在第一种情况下验证失败{'disabled': [u'This field is required.']}
我知道文档中有一条注释说DataRequired验证器“需要强制数据,而不是输入数据”,但是 1)表单是自动生成的wtforms.ext.sqlalchemy,2)如果我使用验证器,它应该如何表现InputRequired?检查(通过form.validate())某些数据是否存在,然后检查该数据是“真”还是“假”?
总而言之,我的问题是:
wtforms.BooleanField …是否可以通过将参数传递给表单构造函数来使我的表单标签动态化?
我正在考虑类似于以下代码的内容:
class MyForm(Form):
def __init__(self, fruit):
Form.__init__(self)
self.fruit = fruit
name = StringField('Do you like' + fruit + "?")
@app.route('/' ,methods=["GET","POST"])
def home():
form = NameForm("bananas")
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,文本输入框的标签似乎永远无法访问变量“fruit” - 即我似乎无法使标签动态化。
可能只是因为我对 Python 对象的理解不够深入,无法理解为什么这是不可能的。
在我使用Flask构建的网站中,我使用WTForms来验证提交的表单。在一种表单中,我使用如下表单提交值列表(隐藏字段是使用 js 在客户端生成的):
<form action="" method="post" id="prop-form">
<input type="hidden" name="ids[]" value="54511ea9c1a36b4e910ce52a">
<input type="hidden" name="ids[]" value="54511ea9c1a36b4e910ce52d">
<input id="title" name="title" size="30" type="text" value="">
<input type="submit" value="Save this form">
</form>
Run Code Online (Sandbox Code Playgroud)
ids[]在 Flask 方面,我可以使用以下代码轻松获取内容:
print request.form
print request.form.getlist('ids[]')
Run Code Online (Sandbox Code Playgroud)
打印出:
ImmutableMultiDict([('ids[]', u'54511ea9c1a36b4e910ce52a'), ('ids[]', u'54511ea9c1a36b4e910ce52d'), ('title', u'Blablabla')])
[u'54511ea9c1a36b4e910ce52a', u'54511ea9c1a36b4e910ce52d']
Run Code Online (Sandbox Code Playgroud)
但是当我在我的 wtform 中创建SelectMultipleField如下时:
ids = SelectMultipleField('ids[]')
Run Code Online (Sandbox Code Playgroud)
然后尝试获取这些值,我得到一个空列表:
print form.ids.data # prints out []
Run Code Online (Sandbox Code Playgroud)
知道如何模仿request.form.getlist('ids[]')使用 WTForms 的行为吗?欢迎所有提示!
我正在尝试使用我的模型并使用 wtform 的 model_form for sqlalchemy 生成表单。我希望带有外键约束的字段是该表中所有项目的选择列表。
到目前为止,对于文字外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷茫。
好的,所以我这里有一个相对简单的数据模型。为此,我可以将其减少到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更多有用的描述。
from . import db
class Status(db.Model):
"""Support status"""
__tablename__ = 'status'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(64), unique=True)
description = db.Column(db.Text)
def __repr__(self):
return self.name
class Hardware(db.Model):
"""Hardware"""
__tablename__ = 'hardware'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(64), unique=True)
description = db.Column(db.Text)
status = db.Column(db.Integer, db.ForeignKey('status.id'))
...
def __repr__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
时髦。
现在我的观点是这样的:
from flask import render_template, request, flash, redirect, url_for
from flask_wtf import Form
from …Run Code Online (Sandbox Code Playgroud) sqlalchemy.exc.InterfaceError: <unprintable InterfaceError object>我正在尝试 Flask,但在提交 wtforms 时遇到错误。模型类是:
class Post(db.Model):
__tablename__ = 'blog_posts'
id = db.Column(db.Integer, unique=True, primary_key=True)
title = db.Column(db.String(50), unique=False)
content = db.Column(db.Text, unique=False)
user_id = db.Column(db.String, db.ForeignKey('users.username'))
@staticmethod
def post_new_entry(title, content, user_id):
""" Post new entry to database """
new_post = Post(title=title, content=content, user_id=user_id)
db.session.add(new_post)
db.session.commit()
return new_post
def __repr__(self):
return 'PostID {}: {} by {}'.format(self.id, self.title, self.user_id)
Run Code Online (Sandbox Code Playgroud)
对于我的表格,我有以下内容:
class PostForm(Form):
title = StringField('Title', validators=[DataRequired(), Length(10, 65)])
post_content = TextAreaField('Content', validators=[DataRequired(), Length(50, 500)])
submit = SubmitField('Publish Post') …Run Code Online (Sandbox Code Playgroud) 我对 WTForms、Flask-WTF 比较陌生。我无法弄清楚如何从表单定义中简单地将 HTML5 属性“自动聚焦”添加到表单字段之一。我想在 Python 代码中这样做,而不是在 Jinja 模板中。这是我所拥有的:
class NameForm(Form):
name1 = StringField("Nom d'utilisateur :",
validators=[Required(), Length(1, 16)])
pwd1 = PasswordField("Mot de passe :",
validators=[Required(), Length(1, 16)])
mail1 = StringField("Compte GMail du calendrier :",
validators=[Required(), Email()])
submit = SubmitField('Envoyer')
Run Code Online (Sandbox Code Playgroud)
我只想将“autofocus”属性添加到“name1”字段中。
我在路线中试过这个:
@app.route('/', methods=['GET', 'POST'])
def form():
name1 = None
pwd1 = None
mail1 = None
msg = None
# Tests
Name_Form_kwargs = {"name1": "" ,"autofocus" :"true"}
Name_Form = NameForm(**Name_Form_kwargs)
print Name_Form.name1
#
form = NameForm()
.....
Run Code Online (Sandbox Code Playgroud)
但这只会更改字段值,不会添加任何属性:
<input id="name1" …Run Code Online (Sandbox Code Playgroud) 在我的flask项目中,我有views.py、models.py(SQLAlchemy到postgres)和forms.py文件。我一直在 form.py 中定义表单并从views.py 实例化它们。
我能够为 SelectField 创建动态内容,但很难为 BooleanField 创建动态内容。这是我正在尝试做的事情:
创建一个从团队中检索球员的表单(在数据库中)。为每个玩家创建一个 BooleanField。如果数据库中的“active”字段为1,则该值被选中(true),否则为未选中(false)。系统用户可以选中/取消选中任何框,然后提交表格。
我对玩家进行迭代没有问题,但我似乎无法弄清楚如何为每个 BooleanField 生成唯一的名称(如果它们具有相同的名称,我只会返回一个值)。我还需要根据用户的活动状态动态传递默认值。
我做了一些研究,看到了一些关于匹配我的 ORM 模型的想法 - 但我并不是真的试图创建一个字段条目来为我的玩家匹配我的 ORM 模型中的每一列 - 只是试图提取一些数据并创建动态表单。
也许可以在 jinja2 模板中完成这一切,但这似乎不是最好的方法......
好的 - 现在尝试变得更基础,但仍然有问题 - BooleanField 总是返回 False:
形式.py:
class myform(Form):
available = BooleanField('available')
submit = SubmitField('Save')
Run Code Online (Sandbox Code Playgroud)
视图.py:
form = myform(available=True)
Run Code Online (Sandbox Code Playgroud)
网页.html
Available: {{ form.available }}
Run Code Online (Sandbox Code Playgroud)
当网页呈现时,复选框被选中(由于 available=True),我正在传递该复选框,但当我提交时,值返回为 False)。
我确实注意到奇怪的是,即使选中该框,渲染的 HTML -<input id="available" type="checkbox" value="y" name="available" checked="">
Checked="" 对我来说没有意义。我注意到,当我删除“available=True”时,就没有checked=“”。我认为正确的 HTML 应该被检查=检查..
假设有一个类属性是根据另一个类属性计算的:
class ClassA(object):
attr1=5
attr2=attr1+10
>>ClassA.attr2
15
Run Code Online (Sandbox Code Playgroud)
然后在子类中,我想更新第一个类属性以导致第二个类属性发生更改,而不重新定义第二个类属性。例如:
class ClassB(ClassA):
attr1=10
Run Code Online (Sandbox Code Playgroud)
我希望发生的是:
>>ClassB.attr2
20
Run Code Online (Sandbox Code Playgroud)
然而,情况并非如此,因为 attr2 是在重新定义 attr1 之前计算的。有没有办法在不重新定义第二个属性的情况下获得这种行为?
(我的特定用例是使用从 Form 类属性派生的 Field 属性(格式、选择等)定义 WTForm,因此我可以对基本 Form 进行子类化并更改这些属性,而无需重新定义整个 Field。)
我有一个表单,用户可以在其中动态添加字段。提交此表单时,后端只能看到后端生成的字段
#forms.py
class ExpensesForm(FlaskForm):
expense_name = StringField('Expense_Item', validators=[DataRequired()])
cost = FloatField('Cost', validators=[DataRequired()])
due_date = DateField('Due Date', format='%Y-%m-%d', validators=[DataRequired()], default=datetime.datetime.today().date())
type = SelectField('Role', choices=[('mutual', 'Mutual'),
('personal#1', 'Personal #1'),
('personal#2', 'Personal #2')
])
Run Code Online (Sandbox Code Playgroud)
return render_template('index.html', form=form, ...)我正在通过从main.py到传递此表格
index.html
所有 4 个字段均通过以下方式生成:
<form class="form-horizontal" id="main-form" enctype=multipart/form-data role="form" method="post" action="/">
<input type="hidden" name="count" value="1"/>
{{ form.csrf_token }}
{{ form.expense_name(placeholder="Expense Name", id="expense_1", value="") }}
{{ form.cost(placeholder="Cost", id="cost_1", class="cost", value="") }}
{{ form.due_date(id="due_date_1") }}
{{ form.type(placeholder="Type", id="type_1") }}
<button id="b1" class="btn btn-info add-more" …Run Code Online (Sandbox Code Playgroud) python ×10
wtforms ×10
flask ×5
attributes ×1
forms ×1
inheritance ×1
json ×1
sqlalchemy ×1
subclass ×1
validation ×1
werkzeug ×1