我在的时候我用的烧瓶POST与wtforms selectfields问题(I'm havi

2019-08-21 13:28发布

我是很新,wtforms和烧瓶中,并瞎搞与selectfields并得到了一个错误。 表单本身只是正常工作没有selectfield但它我得到以下错误:

错误:

....fields.py", line 386, in pre_validate
    for v, _ in self.choices: TypeError: 'NoneType' object is not iterable

我看到selectfield所以它的渲染。 我怀疑莫名其妙的ID没有被正确验证的POST,并没有返回。 或者,它有事情做与我selectfield元组返回? 另外我使用的ID字段从GAE的NDB自动钥匙拔出()。ID(),这是相当长的和厌恶。 它可以被用于selectfield的ID过长?

谷歌搜索没有提供太多的确切问题的条款,以便想我会在这里发表。 下面相关的代码。 如果我失去了一些东西,请让我知道

views.py代码:

@app.route('/new/post', methods = ['GET', 'POST'])
@login_required
def new_post():

    form = PostForm()
    if form.validate_on_submit():
        post = Post(title = form.title.data,
                    content = form.content.data,
                    hometest = form.hometest.data,
                    author = users.get_current_user())
        post.put()
        flash('Post saved on database.')
        return redirect(url_for('list_posts'))
    form.hometest.choices = [ (h.key.id(),h.homename)for h in Home.query()]

    return render_template('new_post.html', form=form)

myforms.py:

class PostForm(Form):
    title = wtf.TextField('Title', validators=[validators.Required()])
    content = wtf.TextAreaField('Content', validators=[validators.Required()])
    hometest = wtf.SelectField(u'Home Name List', coerce=int,validators=[validators.optional()])

new_post.html:

{% extends "base.html" %}

{% block content %}
    <h1 id="">Write a post</h1>
    <form action="{{ url_for('new_post') }}" method="post" accept-charset="utf-8">
        {{ form.csrf_token }}
        <p>
            <label for="title">{{ form.title.label }}</label><br />
            {{ form.title|safe }}<br />
            {% if form.title.errors %}
            <ul class="errors">
                {% for error in form.title.errors %}
                <li>{{ error }}</li>
                {% endfor %}
            </ul>
            {% endif %}
        </p>
        <p>
            <label for="title">{{form.hometest.label}}</label><br/>
            {{form.hometest}}
            {% if form.hometest.errors %}
        <ul class="errors">
            {% for error in form.hometest.errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
        {% endif %}
        </p>
        <p>
            <label for="title">{{ form.content.label }}</label><br />
            {{ form.content|safe }}<br />

            {% if form.content.errors %}
            <ul class="errors">
                {% for error in form.content.errors %}
                <li>{{ error }}</li>
                {% endfor %}
            </ul>
            {% endif %}
        </p>
        <p><input type="submit" value="Save post"/></p>
    </form>
{% endblock %}

Answer 1:

你需要设置你的选择,你打电话之前 validate_on_submit作为form.validate将尝试验证所提供的值(如果有的话)对选择列表(这是None设置前choices ):

form = PostForm()
form.hometest.choices = [(h.key.id(), h.homename) for h in Home.query()]

if form.validate_on_submit():
    # form is valid, continue


Answer 2:

你应该提供choices=[...]的说法,像

wtf.SelectField(u'Home Name List',
                choices=[(1, 'Label 1'),
                         (2, 'Label 2')],
                coerce=int,
                validators=[validators.optional()])


文章来源: I'm having problems with wtforms selectfields when i use a POST with Flask