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 请求来获取搜索结果并显示在上面的模板中。在两个搜索字段的 keyup 上调用 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)

我面临的问题是,当对 NotificationResultView 进行 ajax 调用时,未填充 wtf 表单对象,我认为这是因为没有触发发布请求,但根据我的设计,不需要发布要求。

我曾尝试将 ajax 请求作为发布请求,但即便如此,wtf 表单对象仍为空。

现在我唯一的另一个选择是,如果我在进行 ajax 调用时通过查询字符串中的搜索条件,但不确定这是否是最好的方法。请建议在这种情况下如何进行。

4

1 回答 1

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

在您的 ajax 函数中,您没有发送任何数据。

更新:好的,所以您实际上是在发送数据并且 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. 有很多方法可以做到这一点(最明显的一种是摆弄表单对象的创建,by searchform = SearchForm(formdata = request.args)),并且可以通过使用flask extension更轻松地完成flask-wtf

这是一种方法(我将提供我的示例,因为我不知道您如何构建查询字符串):

在 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 回答