如何将变量从函数传递给WTForm?我使用变量来选择RadioField选项

问题描述 投票:0回答:1

我试图将会话变量传递给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文件(本地和全局)的行。

python-2.7 flask-wtforms
1个回答
0
投票

表单类定义中的代码只在模块初始加载时执行一次,此时局部变量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)
© www.soinside.com 2019 - 2024. All rights reserved.