pru*_*iap 21 python flask wtforms flask-wtforms
我对wtforms和flask很新,并且正在搞乱selectfields并且出错了.表单本身在没有selectfield的情况下工作得很好但是有了它我得到以下错误:
错误:
....fields.py", line 386, in pre_validate
for v, _ in self.choices: TypeError: 'NoneType' object is not iterable
Run Code Online (Sandbox Code Playgroud)
我看到了选择字段,所以它正在被渲染.我怀疑在POST上没有正确验证id并且没有返回任何内容.或者它与我的selectfield元组返回有关?我正在使用的ID字段是从GAE的ndb自动密钥().id()中提取的,这是相当长且令人讨厌的.可能是用于选择字段的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)
Run Code Online (Sandbox Code Playgroud)
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()])
Run Code Online (Sandbox Code Playgroud)
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 %}
Run Code Online (Sandbox Code Playgroud)
Sea*_*ira 38
您需要在调用之前设置您的选择,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
Run Code Online (Sandbox Code Playgroud)
你应该提供 choices=[...]论点,比如
wtf.SelectField(u'Home Name List',
choices=[(1, 'Label 1'),
(2, 'Label 2')],
coerce=int,
validators=[validators.optional()])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17498 次 |
| 最近记录: |