WTForms文档非常不合适,它们甚至没有向您显示自定义窗口小部件的一个示例,该窗口小部件不是从另一个窗口小部件派生的.
我想创建一个按钮类型,这不是<input>在HTML中:
submit = InlineButton(name='submit', type='submit', title='Save this page', textWithinSpan='Save')
Run Code Online (Sandbox Code Playgroud)
这就是我正在尝试的:
from flask.ext.wtf import Required, Length, EqualTo, Field, TextInput, html_params
from flask import Markup
class InlineButtonWidget(object):
text = ''
html_params = staticmethod(html_params)
def __init__(self, input_type='submit', **kwargs):
self.input_type = input_type
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
kwargs.setdefault('type', self.input_type)
if 'value' not in kwargs:
kwargs['value'] = field._value()
return Markup('<button type="submit" %s><span>%s</span></button>' % (self.html_params(name=field.name, **kwargs), kwargs['textWithinSpan']))
class InlineButton(Field):
widget = InlineButtonWidget()
def __init__(self, label='', **kwargs):
self.widget = InlineButtonWidget('submit', label)
def __call__(self, …Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,我的索引页面显示了几个 torrent,每个 torrent 都有一个启动或停止 torrent 的按钮。
我使用表单和循环创建页面,因此表单始终具有相同的名称。但我需要知道用户单击了哪个按钮才能知道要停止哪个 torrent!
这是模板:
{% block content %}
<h1>Hello, {{user}} !</h1>
{% for torrent in torrents %}
<form action="/index" method="post" name="torrent">
{{torrent.control.hidden_tag()}}
<p><a href='/torrent/{{torrent.id}}'>{{torrent.name}}</a> is {{torrent.status}} and {{torrent.progress}} % finished. <input type="submit" value="Start / Stop">
</p>
</form>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这是视图:
@app.route('/index', methods = ['GET', 'POST'])
def index():
user = 'stephane'
torrents = client.get_torrents()
# for each torrent, we include a form which will allow start or stop
for torrent in torrents:
torrent.control = TorrentStartStop() …Run Code Online (Sandbox Code Playgroud) 我有一个动态网页,应该处理两种形式:登录表单和注册表单.我正在使用WTForms来处理这两种形式,但是我在使它工作时遇到了一些麻烦,因为两种形式都被渲染到同一页面.
以下是我的网页登录表单的代码:
PYTHON:
class Login(Form):
login_user = TextField('Username', [validators.Required()])
login_pass = PasswordField('Password', [validators.Required()])
@application.route('/index', methods=('GET', 'POST'))
def index():
l_form = Login(request.form, prefix="login-form")
if request.method == 'POST' and l_form.validate():
check_login = cursor.execute("SELECT * FROM users WHERE username = '%s' AND pwd = '%s'"
% (l_form.login_user.data, hashlib.sha1(l_form.login_pass.data).hexdigest()))
if check_login == True:
conn.commit()
return redirect(url_for('me'))
return render_template('index.html', lform=l_form)
HTML:
<form name="lform" method="post" action="/index">
{{ lform.login_user }}
{{ lform.login_pass }}
<input type="submit" value="Login" />
</form>
Run Code Online (Sandbox Code Playgroud)
以下是我的网页注册表格的代码: …
这是我的HTML下拉菜单.该值是子表的主键.
<select id="category" name="category">
<option selected value="__None"></option>
<option value="1">Category Number One</option>
<option value="2">Category Number Two</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我需要使用值整数1而不是"类别编号一"更新Post.category_id.这是我的代码.
# create new post
@app.route('/admin/post', methods=['GET', 'POST'])
@login_required # Required for Flask-Security
def create_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title=form.title.data,
body=form.body.data,
pub_date=form.pub_date.data,
cateogry_id=form.category.data)
db.session.add(post)
db.session.commit()
flash('Your post has been published.')
return redirect(url_for('admin'))
posts = Post.query.all()
return render_template('create_post.html', form=form, posts=posts)
Run Code Online (Sandbox Code Playgroud)
我试过制作......
cateogry_id=form.category.data
cateogry_id=form.category.value
Run Code Online (Sandbox Code Playgroud)
现在不是那么好!
好的,所以我是新手,想知道我会用什么对象或工具来做这件事.我想创建一个表单,用户输入一些文本,单击提交按钮,然后他们提交的文本绑定为python字符串,并在其上运行一个函数,然后将该文本发布回Web他们正在查看的页面,其中包含该功能的返回值.这是一个例子:
HTML格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action = "/" method="get">
<input type="text" name="mail" size="25">
<input type="submit" value="Submit">
</form>
<textarea cols="50" rows="4" name="result"></textarea>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
那么这就是我认为应该是url函数的样子
@app.route('/', methods=['GET', 'POST'])
def form():
if request.method == 'GET':
input_text = request.data #step to bind form text to python string
new_text = textfunction(input_text) #running the function on the retrieved test.
return (new_text) # no idea if this is write, but returns text after modification.
Run Code Online (Sandbox Code Playgroud)
设置它的最佳方法是什么?将变量作为输入html的值是否正确?需要一些帮助.
我通过Flask-WTF非常简化的wiki阅读,并且无法理解我能用它做什么.我的印象是<form>html 的部分现在只能看起来像
<form method="post">
{{ form.hidden_tag() }}
{{ form.name }}
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
但我真的想要使用物化的样式,例如:
<div class="row">
<div class="input-field col s6">
<i class="material-icons prefix">account_circle</i>
<input value="FN" id="first_name" type="text" class="validate">
<label class="active" for="first_name">First Name</label>
</div>
<div class="input-field col s6">
<input value="LN" id="last_name" type="text" class="validate">
<label class="active" for="last_name">Last Name</label>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我在哪里能适应{{ form.first_name }}并{{ form.last_name }}进入?
编辑:让我详细说明我的答案:例如,我想要像Materialized datepicker(一个很好的弹出日历,让用户选择日期),这应该在<input class='datepicker' length="50">,但现在我正在替换整<input>行与{{ form.date }}...我失去了编辑课程的特权,但没有.
有谁知道datalist在 Flask 中使用 WTForms创建字段的方法吗?
我知道如何创建一个,SelectField但如果它不在列表中,我需要允许用户输入他们自己的值。
这就是我想做的http://www.w3schools.com/tags/tag_datalist.asp
谢谢
form.validate_on_submit()和之间有什么区别form.validate()?
在Flask WTF文档中,作者使用form.validate_on_submit().代码有效.当我替换form.validate_on_submit()时form.validate(),我发现行为没有区别.我form.validate_on_submit()在源form.validate() 代码中找不到,但我找到了代码.
我在模态中有一个表单,用于编辑对某个项目(香水)的评论。一款香水可以有多个评论,评论存在于一系列嵌套文档中,每个文档都有自己的 _id。
我正在通过将 EditReviewForm 提交到此edit_review路线来编辑每个特定评论(以防用户想要在提交后编辑他们对香水的评论):
@reviews.route("/review", methods=["GET", "POST"])
@login_required
def edit_review():
form = EditReviewForm()
review_id = request.form.get("review_id")
perfume_id = request.form.get("perfume_id")
if form.validate_on_submit():
mongo.db.perfumes.update(
{"_id": ObjectId(perfume_id), <I edit my review here> })
return redirect(url_for("perfumes.perfume", perfume_id=perfume_id))
return redirect(url_for("perfumes.perfume", perfume_id=perfume_id))
Run Code Online (Sandbox Code Playgroud)
这条路线重定向到我的香水路线,其中显示了香水及其包含的所有评论。
这是perfume路线:
@perfumes.route("/perfume/<perfume_id>", methods=["GET"])
def perfume(perfume_id):
current_perfume = mongo.db.perfumes.find_one({"_id": ObjectId(perfume_id)})
add_review_form = AddReviewForm()
edit_review_form = EditReviewForm()
cur = mongo.db.perfumes.aggregate(etc)
edit_review_form.review.data = current_perfume['reviews'][0]['review_content']
return render_template(
"pages/perfume.html",
title="Perfumes",
cursor=cur,
perfume=current_perfume,
add_review_form=add_review_form,
edit_review_form=edit_review_form
)
Run Code Online (Sandbox Code Playgroud)
我的问题
找到一种方法来获取该review _id过程并将其放入我的perfume路线中,以便我可以使用当前值预先填充我的 EditReviewForm。否则,对于编辑评论的用户来说,表单看起来是空的。 …
有没有一种方法可以在WTFforms中实现验证,强制要求至少有一个字段是必需的?
例如,我有两个StringFields,我想确保用户在单击“提交”之前至少在其中一个字段中写入一些内容。
field1 = StringField('Field 1', validators=[???])
field2 = StringField('Field 2', validators=[???])
Run Code Online (Sandbox Code Playgroud)
我应该写什么来代替????InputRequired()在这种情况下,无法完成这项工作,因为我需要将其分配给其中一个字段或同时分配给两个字段。我怎样才能做到这一点?
flask-wtforms ×10
flask ×9
python ×9
wtforms ×6
forms ×1
html ×1
javascript ×1
jinja2 ×1
python-3.x ×1
validation ×1