如何将变量从函数传递到 WTForm?我使用变量来选择 RadioField 选项
How do I pass a variable from a function to a WTForm? I use the variable to choose RadioField choices
我正在尝试将会话变量传递到 WTForm。我使用变量来选择 RadioField 条目。
我试图将其作为常规变量传递,但 WTForm 无法识别该变量。我尝试了不同的论点,但它仍然无法在 WTForms 中识别它。这是我正在传递的可变级别。我知道如果我在 class ZWOForm(Form): What am I missing?
的第一行写 level = 1 (or 2 or 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 %}
我看到的错误是 "level" is not defined 和渲染错误,这些错误会吐出一堆指向其他 .py 文件(本地和全局)的行。
表单 class 定义中的代码只在模块最初加载时执行一次,此时局部变量 level
不存在。即使它在那时确实存在,您也只会设置一次 class 定义,而您希望能够在每次显示时更改表单选项。这可以在您的视图函数中轻松实现。不要在表单 class 中设置字段选择,而是在通过设置字段选择属性的值创建表单后在表单本身上设置它们。鉴于每个级别的可用选项数量恰好等于该级别的值,您可以使用列表切片来生成此列表。
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 条目。
我试图将其作为常规变量传递,但 WTForm 无法识别该变量。我尝试了不同的论点,但它仍然无法在 WTForms 中识别它。这是我正在传递的可变级别。我知道如果我在 class ZWOForm(Form): What am I missing?
的第一行写 level = 1 (or 2 or 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 %}
我看到的错误是 "level" is not defined 和渲染错误,这些错误会吐出一堆指向其他 .py 文件(本地和全局)的行。
表单 class 定义中的代码只在模块最初加载时执行一次,此时局部变量 level
不存在。即使它在那时确实存在,您也只会设置一次 class 定义,而您希望能够在每次显示时更改表单选项。这可以在您的视图函数中轻松实现。不要在表单 class 中设置字段选择,而是在通过设置字段选择属性的值创建表单后在表单本身上设置它们。鉴于每个级别的可用选项数量恰好等于该级别的值,您可以使用列表切片来生成此列表。
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)