如何将变量从函数传递给WTForm?我使用变量来选择RadioField选项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将变量从函数传递给WTForm?我使用变量来选择RadioField选项相关的知识,希望对你有一定的参考价值。
我试图将会话变量传递给WTForm。我使用变量来选择RadioField条目。
我试图将它作为常规变量传递,但WTForm无法识别变量。我尝试了不同的论点,但它仍然没有在WTForms中识别它。这是我传递的变量级别。我知道如果我在ZWOForm(Form)类的第一行写level = 1(或2或3),一切都有效:我错过了什么?
来自init.py:
class ZWOForm(Form):
zwotitle = TextField('Title', [validators.Length(min=3, max=50)])
zwotags = TextField('Tags', [validators.Length(min=3, max=50)])
category = TextField('Category (Your Choice)', [validators.Length(min=3, max=50)])
if level <3:
if level <2:
zwolevel = RadioField('Viewing Level', choices=[('1','Public')], default=1)
else:
zwolevel = RadioField('Viewing Level', choices=[('1','Public'),('2','Private')], default=1)
else:
zwolevel = RadioField('Viewing Level', choices=[('1','Public'),('2','Private'),('3','Team')], default=1)
zwodescription = TextAreaField('Description', [validators.Length(min=3, max=200)])
@app.route('/createzwo/', methods=["GET","POST"])
@login_required
def create_zwo():
try:
level = session['level']
form = ZWOForm(request.form)
if request.method == "POST" and form.validate():
...
return render_template("createzwo.html", form=form)
来自HTML表单:
{% from "_formhelpers.html" import render_field %}
<form method=post action="/createzwo/">
<dl>
{{render_field(form.zwotitle)}}
{{render_field(form.zwotags)}}
{{render_field(form.category)}}
{{render_field(form.zwolevel)}}
{{render_field(form.zwodescription)}}
</dl>
<p><input type=submit value="Create ZWO File"></p>
</form>
来自_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 %}
我看到的错误是“级别”没有定义和渲染错误,这些错误吐出了一堆指向其他.py文件(本地和全局)的行。
答案
表单类定义中的代码只在模块初始加载时执行一次,此时局部变量level
不存在。即使它确实存在,您只需设置一次类定义,而您希望每次显示时都能更改表单选项。这可以在您的视图功能中轻松实现。不要在表单类中设置字段选项,而是在创建表单之后通过设置字段选择属性的值将其设置在表单上。鉴于每个级别的可用选项数量恰好等于该级别的值,您可以使用列表切片来生成此列表。
class ZWOForm(Form):
zwotitle = TextField('Title', [validators.Length(min=3, max=50)])
zwotags = TextField('Tags', [validators.Length(min=3, max=50)])
category = TextField('Category (Your Choice)', [validators.Length(min=3, max=50)])
zwolevel = RadioField('Viewing Level', choices=[], default=1)
zwodescription = TextAreaField('Description', [validators.Length(min=3, max=200)])
@app.route('/createzwo/', methods=["GET","POST"])
@login_required
def create_zwo():
try:
form = ZWOForm(request.form)
all_choices = [('1','Public'),('2','Private'),('3','Team')]
choices = all_choices[:session["level"]]
form.zwolevel.choices = choices
if request.method == "POST" and form.validate():
...
return render_template("createzwo.html", form=form)
以上是关于如何将变量从函数传递给WTForm?我使用变量来选择RadioField选项的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中定义空变量或将值从函数传递给全局变量? [复制]