我对 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) 我有一个 WTForms 字段(value_currency),我希望有时是 SelectField,有时是 HiddenField。我对创建新项目和编辑现有项目的页面使用相同的视图和模板。如果我加载页面来创建一个新项目,我希望这个字段是一个 SelectField,如果我加载页面来编辑一个现有项目,我希望这个字段是一个 HiddenField,因为它是一个不可编辑的字段。
这是我到目前为止所拥有的:
形式
class PromoForm(Form):
value = StringField('value')
currencies = Currency.query.order_by(Currency.id).all()
currency_choices = []
for currency in currencies:
currency_choice = (currency.id, currency.name)
currency_choices.append(currency_choice)
value_currency = SelectField('value_currency', choices=currency_choices)
Run Code Online (Sandbox Code Playgroud)
看法
@app.route('/promo/<id>', methods=['GET', 'POST'])
@login_required
def promo(id):
form = PromoForm()
# Existing promo will pass in its id
# id = 0 if a new promo is to be created
if id != str(0):
# Load existing promo
promo = Promo.query.get(id)
# display value in decimal format …Run Code Online (Sandbox Code Playgroud) 我正在关注本教程http://flask.pocoo.org/docs/0.10/patterns/wtforms/
这是一个带有宏的 _formhelpers.html 模板示例:
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
这里的 register.html 模板利用了 _formhelpers.html 模板:
{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
Run Code Online (Sandbox Code Playgroud)
它最终生成了一个序列:
<dt><label for="email">Email Address</label> …Run Code Online (Sandbox Code Playgroud) 我对 Python 还是很陌生(老实说,一般来说,编程)。我目前正在制定一种待办事项清单,我需要它来将待办事项放入适当的课程中(这都与教育相关)。所以,问题很简单。我将此作为 Flask 驱动的路线:
@app.route('/add_course', methods=('GET', 'POST'))
@login_required
def course():
form = forms.CourseForm()
if form.validate_on_submit():
models.Course.create(teacher=g.user._get_current_object(),
name=form.name.data.strip(),
difficulty=form.level.data.strip(),
description=form.description.data.strip())
flash("Course successfully created!", "success")
return redirect(url_for('index'))
return render_template('add_course.html', form=form)
Run Code Online (Sandbox Code Playgroud)
然后我把这个放在forms.py. 你可以看到我用聪明的标记来表明我的问题在哪里。它说THE_PROBLEM
def courses():
try:
courses = models.Course.select(models.Course.id,
models.Course.name,
models.Course.difficulty).where(THE_PROBLEM)
course_list = []
for course in courses:
course_list.append((str(course.id), course.name + ' - ' + course.difficulty.title()))
return course_list
except models.DoesNotExist:
return [('', 'No courses')]
class ToDoForm(FlaskForm):
name = StringField("What's up?", validators=[
DataRequired()
])
due_date = DateTimeField('When?', format='%Y-%m-%d %H-%M')
course …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Flask-WTF 用于我添加到我最近继承的 Flask 应用程序的新表单。我对 Flask 生态系统相当陌生(对 WTForms 完全陌生),四年来我没有做过任何 Web 开发。
Flask-WTF 文档中的示例代码在表单验证失败时呈现页面,而不是重定向(Post/Redirect/Get)。此时,浏览器刷新将重新提交之前的 POST。这不好,对吧?虽然大多数人似乎没有对这种情况给予任何关注,但我确实看到一些人认为这是需要避免的(例如这里和这里)。
那么在使用 Flask-WTF 时如何避免这个问题呢?如果我在验证失败时重定向,我想我将失去在每个字段上显示验证错误的能力。或者也许我不应该担心这种情况?
我正在构建一个简单的 Flask 服务器,它将为一小群人提供编译服务。
可以使用url连接到服务器,将他的功能代码输入到a中</textarea>,然后点击一个“ submit”按钮,该按钮将在后台编译代码,然后将其显示</textarea>在同一页面上的另一个上。每个这样的编译请求可能需要几分钟,所以我想我需要一些队列来存储这些用户的请求,以防一些用户同时发出请求。最好的方法是什么?我应该创建一个Lib/Queue并手动管理所有内容,然后将回调排队等等吗?
我假设有一些已知的方法可以将向服务器发出的此类请求排队,而这只是不知道。我不认为我需要在这里重新发明轮子。
我正在用来flask-wtforms创建一个文本区域。
body = TextAreaField('body')
Run Code Online (Sandbox Code Playgroud)
我想更改文本区域的值,您可以像这样在 html 中执行此操作。
<textarea>other value then default</textarea>
Run Code Online (Sandbox Code Playgroud)
如何将其与 Flask-wtforms 集成?
我的模板如下所示:
{{ form.body(rows="20") }} <!--texarea -->
Run Code Online (Sandbox Code Playgroud)
通过一个简单的输入字段,我可以做这样的事情:
{{ form.body(value="other value then default") }} <!-- input field -->
Run Code Online (Sandbox Code Playgroud)
我需要在模板本身中设置默认值。因为它将包含该页面所涉及的文章的信息。
基于两个或多个条目验证 WTform 的最佳方法是什么?即在下面的表格中,我想验证数据库中不存在具有提供的名称和地址的公司。
class CompanyForm(FlaskForm):
name=StringField('Company Name', validators=[DataRequired()])
address=StringField('Street Address', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)
像这样的东西...
def validate_name(self, name, address):
company = Company.query.filter_by(name=name.data, address=address.data).first()
if company is None:
raise ValidationError('This company already exists in our database.')
Run Code Online (Sandbox Code Playgroud)
我通读了关于 SO 的文档和类似的问题,但我仍然无法弄清楚。
我在登录页面中有一个 HTML 表单,我想通过 ajax 将表单数据发送到 /data rout。
问题是在后端验证此 HTML 表单。
我知道 Flask WTF 表单,但使用这种方法会在后端生成表单,这不是我的情况。
from flask import Flask, request, url_for
...
@app.route("/data", methods=["GET", "POST"])
def get_data():
if request.method == "POST":
username = request.form["username"]
...
Run Code Online (Sandbox Code Playgroud)
我的 html 表单:
<form method="POST" action="">
<input type="text" name="username">
<input type="submit" value="Send">
</form>
Run Code Online (Sandbox Code Playgroud)
一种困难的方法是使用正则表达式验证每个字段并为它们编写几个 if 条件。我想知道更简单的方法吗?
我试图用一个参数定义一个 Flask 表单。这是我的方法:
forms.py
class RegisterPatternForm(FlaskForm):
cursorPatients = MongoClient('localhost:27017').myDb["coll"].find({"field1": self.myParam}).sort([("id", 1)])
patientOpts = []
for pt in cursorPatients:
row = (str(pt.get("id")), "{} {}, {}".format(pt.get("surname1"), pt.get("surname2"), pt.get("name")))
patientOpts.append(row)
patients = SelectMultipleField('Select the patient', validators=[Optional()], choices=patientOpts)
submit = SubmitField('Register')
def __init__(self, myParam, *args, **kwargs):
super(RegisterPatternForm, self).__init__(*args, **kwargs)
self.myParam = myParam
Run Code Online (Sandbox Code Playgroud)
routes.py
myParam = 5
form = RegisterPatternForm(myParam)
Run Code Online (Sandbox Code Playgroud)
基本上,我想读取在 form 上myParam定义的变量。在作品中插入参数,以及在. 它失败的地方是读取以.routes.pyRegisterPatternFormroutes.py__init__RegisterPatternFormcursorPatients
因此,我的问题是,如何解决此问题才能读取myParam表单中的值?
flask-wtforms ×10
flask ×8
python ×7
wtforms ×5
html ×2
flask-login ×1
jinja2 ×1
python-2.7 ×1
validation ×1