1

ユーザーが検索パラメーターを入力できるテンプレートがあります (search.html)

{% from "_formhelpers.html" import render_field %}
<form method=”post”&gt;
<dl>
    {{ render_field(form. notificationId) }}
    {{ render_field(form. recordName) }}
</dl>
<div id="searchResults" > </div>
</form>

大きい

{% 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 %}

検索結果のテンプレート(result.html)

{% for notification in content %}
  Result:
  content[notification]['type'] }}</td>
{% endfor %}

次の ajax リクエストを使用して、検索結果を取得し、上記のテンプレートに表示します。 ajax 関数は、両方の検索フィールドのキーアップで呼び出されます。

$.ajax(
    {
      url: ‘result’,
      dataType: "html",
      data:createQueryString(),// gets the value from the dataFields and creates a queryString 
      success: function(data) 
      {
                              $("# searchResults").html(data);      }    });

また、検索基準セクション (2 つの検索フィールドを含むセクション) 用と検索結果セクション用の 2 つのビューがあります。

class NotificationSearchView(MethodView):
 def get(self):
   searchform = SearchForm()
   return render_template("search.html”, searchform=searchform)

 @classmethod
 def registerSelf(cls, app):
   NotificationSearchView.app = app
   app.flaskApp.add_url_rule('/search ', view_func=NotificationSearchView.as_view(‘search’))

class NotificationResultView(MethodView):
 def get(self):
   searchform = SearchForm()
   success, content=self.performSearch(searchform) //search method which takes the search parameters and performs the search
   return render_template("result.html”, content=content)

@classmethod
def registerSelf(cls, app):
   NotificationResultView.app = app
   app.flaskApp.add_url_rule('/result', view_func= NotificationResultView.as_view(‘result’))

WTFフォームクラス

from wtforms import Form, TextField 
class SearchForm(BaseForm):
    notificationId = TextField(notificationId)
    recordName = TextField(recordName)

私が直面している問題は、Ajax 呼び出しが NotificationResultView に対して行われたときに wtf フォーム オブジェクトが入力されないことです。これは、投稿要求が発生していないためだと思いますが、私の設計によれば、投稿の必要はありませんリクエスト。

私はポストリクエストとしてajaxリクエストを作成しようとしましたが、それでもwtfフォームオブジェクトは空に戻ります。

私の唯一の他のオプションは、ajax呼び出しを行うときにクエリ文字列で検索条件を渡す場合ですが、それが最善のアプローチであるかどうかはわかりません。この場合の進め方を提案してください。

4

1 に答える 1

1
$.ajax(
    {
      url: ‘result’,
      dataType: "html",
      success: function(data) 
      {
                              $("# searchResults").html(data);      }    });

あなたのajax関数では、データを送信していません。

update : わかりました。実際にデータを送信しており、URL は正しいです。

class NotificationResultView(MethodView):
 def get(self):
   searchform = SearchForm()
   success, content=self.performSearch(searchform) //search method which takes the search parameters and performs the search
   return render_template("result.html”, content=content)

ビュー関数(「結果」にルーティングされます)の上から、問題はsearchform = SearchForm()提供されたGETクエリで満たされていないことです。

これを解決するには、 に値を指定する必要がありますsearchform。それを行うには多くの方法があり (最も明白な方法は、 によるフォーム オブジェクトの作成をいじることですsearchform = SearchForm(formdata = request.args))、フラスコ エクステンション を使用すると簡単に実行できますflask-wtf

これを行う1つの方法を次に示します(クエリ文字列の作成方法がわからないため、例を示します):

htmlで:

query_obj = { foo : 'bar', bar : 'baz', answer : 42 };
$.params(query_obj); //foo=bar&bar=baz&answer=42 
/* ajax using above params */

パラメーターがビューに正常に提供されていることを前提としています。

@app.route('/result', method=['GET'])
def fooview():
  foo = request.args.get('foo', '')
  bar = request.args.get('bar', '')
  answer = request.args.get('answer', None, type=int)
  ..

それが役立つことを願っています。

于 2013-03-05T21:08:57.167 に答える