如何使用 ajax 调用(即 Select2)填充 WTForms SelectField?

2024-06-21

我正在尝试使用 Flask + WTForms + Select2 (ajax 调用)实现一个网络应用程序,但不幸的是没有取得巨大成功。主要问题与我的 WTForms 类之一中的属性“choices”有关,因为我无法理解如何使用 ajax 调用填充选择菜单并让 WTForms 类管理这些数据。 这是我的解决方法:

class insertData(FlaskForm):
    ...
    feature_tag = SelectMultipleField(
        u'Features',
        choices=[(0, "")],
        coerce=int,
        render_kw={"multiple": "multiple"},
        id="feature_tag_sel2")
    ...

这在模板中调用:

<div class="col-sm-4">
    {{form.feature_tag}}
</div>

由 Select2 管理:

$("#feature_tag_sel2").select2({
    minimumInputLength: 2,
    ajax: {
      url: "/select/api/feature",
      dataType: 'json',
      data: function (params) {
          return { q: params.term };
      },
      processResults: function (data) {
          return {results: data};
      },
      cache: false
    }
});

最后,ajax 调用引用了这段代码:

@app.route('/select/api/feature')
def suggestion_feature():
    param = request.args.get('q', '')
    q = db.session.query(Feature).filter(Feature.nome_f.startswith(param)).all()
    value = [dict(id=i.id, text=i.nome_f) for i in q]
    return json.dumps(value)

当此代码运行时,无论 select 的值是什么,validate_on_submit出现错误:我可以从 Select2 菜单中选择多个值,但当然任何与 0 不同的值都不是有效的选择。然后我尝试通过实现新的字段定义来阻止此错误的传播:

class Select2MultipleField(SelectMultipleField):
    def pre_validate(self, form):
        # Prevent "not a valid choice" error
        pass

这段代码可以工作,但无论如何它都是一种解决方法。例如,当validate_on_submit在表单中发现另一个错误并重新加载页面,所有选定的值都会丢失。当我需要编辑数据时也会发生同样的情况。总而言之,这种解决方法让我失去了 WTForms 的许多优点。

因此问题是:是否有任何方法可以将 WTForms SelectField 与通过 ajax 调用检索的数据集成?

已编辑 2021 年 10 月 8 日

对于仍然对此事感兴趣的人,我找到了以下解决方案:烧瓶选择2 https://github.com/pjcunningham/Flask-Select2。它只需很少的修改就可以很好地集成到代码中。唯一的缺陷是它只能在 Select2 版本中开箱即用。 3(对于Select2当前版本的更新,有几个点需要重写)


根据我对您问题的理解,您的 ajax select2 和 WTForm 有两个问题。

  • 提交表单时不是有效的选择
  • 和所选值丢失以及表单重新加载或错误

让我尝试按如下方式解决它们:

提交表单时不是有效的选择

对于第一个问题不是有效的选择,您可以告诉 wtf 表单不要在提交表单时验证它,是的,您的解决方案!它对我也有用。

class Select2MultipleField(SelectMultipleField):
    def pre_validate(self, form):
        # Prevent "not a valid choice" error
        pass

所选值丢失并且表单重新加载或错误

引用自你的问题

当 validate_on_submit 在表单和页面中发现另一个错误时 重新加载后,所有选定的值都会丢失。当我时也会发生同样的情况 需要编辑数据。

是的,这确实按预期工作。首先,选择字段不包含任何选项,因为选择字段中的所有数据都是从远程 ajax 调用获取的,这意味着当您使用 WTForm 调用创建时,选择字段没有提供任何数据选择代码在这里

class insertData(FlaskForm):
    ...
    feature_tag = SelectMultipleField(
        u'Features',
        choices=[(0, "")],
        coerce=int,
        render_kw={"multiple": "multiple"},
        id="feature_tag_sel2")
    ...

事实上,你不必提供论据choices因为您的数据是从远程 ajax 调用调用的,并且您已经解决了问题Not a valid choice已经。

要回答您的问题并解决第二个问题,您可以检查数据值是否附加在您的选择字段中,如下所示,并将其创建为您选择字段的选项,如下所示:

<div class="col-sm-4">
    {{form.feature_tag}}
</div>

<script>
$(document).ready(function(){
$("#feature_tag_sel2").select2({
    minimumInputLength: 2,
    ajax: {
      url: "/select/api/feature",
      dataType: 'json',
      data: function (params) {
          return { q: params.term };
      },
      processResults: function (data) {
          return {results: data};
      },
      cache: false
    }
});

{# check if select field come with data previously selected #}
{% if form.feature_tag.data %}
{# trigger an ajax call to url with parameter of this value #}

        $.ajax("/select/api/feature?q={{form.feature_tag.data}}", {
                dataType: "json"
        }).done(
                function(data) { 
                    text = data.items[0].text // text returned from your url
                    id = data.items[0].id. // id returned from your url
                    
                    // created an option for the select field
                    var newOption = new Option(text, id, false, false)

                    $('#{{form.feature_tag.id}}').append(newOption).trigger('change')

                    $('#{{form.feature_tag.id}}').val(id).trigger('change')
    
                }
        );

{% endif %}


});

</script>

这样,您的选择字段在您查看或编辑它之前应该已经包含您之前选择的值:)

希望这有帮助!谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ajax 调用(即 Select2)填充 WTForms SelectField? 的相关文章

  • HTML 页面的 jQuery load() 中未加载图像

    我正在使用以下代码在 div 中加载 html 页面 htmlViewer load conversion test to convert 3264 getPageName pageCount htm function response s
  • 在数据表 Ajax 调用中通过 Ajax 更新 div

    我想进行一次 Ajax 调用 不仅更新数据表 还更新位于页面其他位置的 div 我正在使用 Ajax datatable rails gem 我构建了 ajax 调用的上半部分 例如 people datatable dataTable p
  • Ajax Jquery 调用重定向

    我是 ajax 的新手 我知道有人已经遇到过这个问题 我有一个基于 Spring MVC 构建的遗留应用程序 它有一个拦截器 过滤器 可以将用户重定向到登录 每当没有会话时页面 public class SessionCheckerInte
  • 没有数据的ajax请求不起作用

    我正在尝试使用 ajax 删除照片 当照片被删除时会立即显示默认图像 到目前为止我已经完成了 php 方面的工作 但 ajax 部分不起作用 如何在没有数据类型的情况下发出ajax请求 function delete image ajax
  • .trigger 函数的回调

    我有以下代码 scheduleLink trigger click alert text 这是点击处理程序 scheduleLink bind click function loadScheduleEvent wrap tabs find
  • 跨浏览器AJAX功能动态加载HTML

    我正在寻找一个 AJAX 函数来动态请求 HTML 页面 我已经找到以下内容 function ajaxinclude url var page request false if window XMLHttpRequest if Mozil
  • 防止在 AJAX 请求上发送 Cookie

    我有一个从脚本调用的 Web 服务 但不需要存储在 cookie 中的任何信息 每当我向服务发出请求时 cookie 都会随之发送 我知道默认情况下 cookie 是通过 HTTP 请求发送的 但是有什么方法可以覆盖该行为而不发送 cook
  • 通过systemd服务启动烧瓶

    有一个systemd服务文件 etc systemd system flask app service Unit Description flask app After network target Service User root Wo
  • 接收 AJAX HTTP 响应代码为 0

    我有一个非常简单的 AJAX 和 PHP 代码 通过 AJAX 调用 PHP 时 它收到的响应代码为 0 PHP 代码已成功运行 但我无法获得响应 这个状态 0 表示什么 我该如何解决这个问题 function confirmUser id
  • Flask 上下文处理器函数

    按照 Flask 页面上的最小示例 我尝试构建一个上下文处理器 上下文处理器 py def inflect this def inflectorize number word return format number inflectoriz
  • 使用python,自动确定用户当前时区的最准确方法是什么

    我已经验证 dateutils tz tzlocal 在heroku上不起作用 即使它起作用 它不是只是从计算机的操作系统中获取tz 而不是用户吗 如果没有存储用户时区 有什么方法可以确定请求来自哪里 我用的是烧瓶 Twitter 确实有一
  • JSON数据通过JS/AJAX转化为PHP

    Goal 我正在使用 coinmarketcap com API link https api coinmarketcap com v1 ticker convert EUR 预先我将他们的数据转换成 PHP 样本 现在我想使用AJAX J
  • 使用 Flask 测试客户端请求传递 cookie 标头

    我在让 Flask 测试客户端传递 cookie 时遇到问题 这段代码曾经有效 我认为我的环境中的某些内容发生了变化 这打破了这一点 我最近创建了一个新的 Python 3 7 virtualenv 并安装了 Flask 1 0 2 fro
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库
  • Cordova:如何诊断 ajax 不适用于 UWP(Windows 商店)应用程序

    我有一个简单的 Cordova 应用程序 在构建并作为 Windows UWP 应用程序运行时 ajax 调用会以某种方式阻止我的工作网络 我以前曾多次问过这个问题 但我想尝试改写 因为从未得到任何解决方案 应用程序 ajax 调用在我的家
  • 如何在同一视图中渲染两个分页且可 ajax 的集合?

    在 Rails 3 2 索引视图中 我正在渲染两个部分 并且在部分 Show some fields 分页不起作用 如果我改变will paginate要获取实例变量 分页可以工作 但是集合错误 当调用部分时 如何将
  • 在长时间 Ajax 调用期间显示进度

    我有一个简单的网站 http www kousenit com twitterfollowervalue http www kousenit com twitterfollowervalue 根据一个人的 Twitter 关注者计算数量 由
  • 识别 ASP.NET MVC 代码中的 Angular js AJAX 调用

    我正在使用 ASP NET MVC 和 AngularJS 开发一个示例应用程序 在服务器端代码中 我编写了一个Action过滤器属性 其中我需要检查请求是普通请求 浏览器 还是AJAX请求 public override void OnA
  • Flask 中的 import 和 extends 有什么区别?

    我正在阅读 Flask Web 开发 在例4 3中 extends base html import bootstrap wtf html as wtf 我想知道 extends 和 import 有什么区别 我认为它们在用法上很相似 在什
  • 部署 Flask 应用程序时如何检测额外文件的更改并重新加载应用程序? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 Flask 中构建了一个小型 Web 应用程序 并尝试将其部署在 Pythonanywhere 上 在开发过程中

随机推荐