2

エンティティに関するすべての情報を一覧表示し、ユーザーがエンティティに関するメモを追加できるようにするページを作成しようとしています。私は Google App Engine で Flask を使用しています (Kamal Gill によって書かれたボイラープレートを使用しています)。

私の質問は 2 つの部分です: 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>&nbsp;</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 コンテキスト内でフォームを作成しようとしたことがエラーの原因であることはわかっていますが、それを修正する方法がよくわかりません。そして、私の 2 つの大きな問題に取り組む方法がわかりません。

ありがとうございます。さらに明確にする必要がある場合はお知らせください。

編集:ルーティングに関するこの質問を見てきましたが、必要なことに役立つかどうかを判断するのに十分なほど理解していません。

4

1 に答える 1

8

URL を構築する際に、エージェンシー パラメータを add_notes ビューに渡す必要があります。

<form method="post" action="{{ url_for('add_notes',agency='something') }}">
于 2012-04-19T17:03:13.253 に答える