我试图创建一个页面,列出有关实体的所有信息,然后允许用户添加有关实体的注释。我在Google App Engine上使用Flask(使用Kamal Gill编写的样板)。
我的问题是两部分:a)如何查询有关实体的信息,然后使用表单发布信息?b)如何将实体信息传递给表单,以便它编辑实体?
我得到的是:
#model.py
class Providers(db.Model):
"""Provider Information DB"""
pAgency = db.StringProperty()
pSite = db.StringProperty()
programName = db.StringProperty()
pNotes = db.TextProperty()
#forms.py
class ProviderForm(wtf.Form):
providerName = wtf.TextField()
providerNote = wtf.TextAreaField('Add notes', validators=[validators.Required()])
在views.py中
def list_addresses(agency):
addrs = []
addresses = db.Query(Providers).filter('pAgency =', agency).order('pAddress')
for addr in addresses:
addrs.append((addr.pAddress, addr.programName))
return addrs
def add_notes(agency):
form = ProviderForm()
if form.validate_on_submit():
notes = ProviderNotes(
pNotes = form.providerNote.data)
try:
notes.put()
return 'Worked'
except:
return redirect(url_for('list_provs'))
return render_template('provider_notes.html', form=form, addrs=list_addresses(agency))
url规则:
# Add notes
app.add_url_rule('/providers/<agency>', 'add_notes', view_func=views.add_notes, methods=['GET', 'POST'])
我现在拥有的HTML如下:
<ul>
<h1 id="">Provider Information</h1>
{% for address in addrs %}
<p>{{address}}</p>
{% for prog in programs %}
{% if prog != '' %}
<li>{{prog}}</li>
{% endif %}
{% endfor %}
<p> </p>
{% endfor %}
</ul>
<form method="post" action="{{ url_for('list_addresses') }}">
{% for field in form %}
<p>{{ field.label }}</p>
<p>{{ field }}</p>
{% endfor %}
<p>
<button type="submit">Save notes</button>
<a href="{{ url_for('list_provs') }}">Cancel</a>
</p>
</form>
这会导致回溯错误:
Traceback (most recent call last):
File ".../src/packages/flaskext/gae_mini_profiler/profiler.py", line 303, in __call__
result = self.app(environ, start_response)
File ".../src/packages/flask.zip/flask/app.py", line 1506, in wsgi_app
File ".../src/packages/flask.zip/flask/app.py", line 1504, in wsgi_app
File ".../src/packages/flask.zip/flask/app.py", line 1264, in full_dispatch_request
File ".../src/packages/flask.zip/flask/app.py", line 1262, in full_dispatch_request
File ".../src/packages/flask.zip/flask/app.py", line 1248, in dispatch_request
File ".../src/application/views.py", line 55, in add_notes
return render_template('provider_notes.html', form=form, addrs=list_addresses(agency))
File ".../src/packages/flask.zip/flask/templating.py", line 123, in render_template
File ".../src/packages/flask.zip/flask/templating.py", line 107, in _render
File ".../src/packages/jinja2.zip/jinja2/environment.py", line 891, in render
File ".../src/application/templates/provider_notes.html", line 1, in top-level template code
<form method="post" action="{{ url_for('add_notes') }}">
BuildError: ('add_notes', {}, None)
只有当add_notes()被赋予参数时,才会发生此错误。
我是python的初学者,所以我可能遗漏了一些非常明显的东西。我知道这个错误源于试图在GET上下文中创建一个表单,但是我不确定如何修复它。我不知道该如何着手解决我的两个大问题。
谢谢,如果我需要进一步澄清的话,请告诉我!
编辑:我一直在关注this question on routing,但还不太了解它是否能满足我的需求。
最佳答案
在生成url时,必须将agency参数传递到add_notes视图:
<form method="post" action="{{ url_for('add_notes',agency='something') }}">
关于python - 获取信息并在Flask中发布表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10222176/