【问题标题】:Flask WTForms -- custom field flagsFlask WTForms——自定义字段标志
【发布时间】:2020-01-06 20:25:32
【问题描述】:

我构建了一个自定义验证器,用于检查用户输入是否存在于数据库中。现在我想添加一个自定义字段标志,如果验证不成功(无需重新渲染 html)就会弹出,类似于 InputRequired 验证器中的 'required' 标志。

这是我的验证器:

class ProjectExists(object):
    field_flags = ('project_not_exists', )   # need the custom flag here

    def __init__(self, project_code=None, message=None):
        self.project_code = project_code
        self.message = message
        self.conn, self.cur = connect_db()


    def __call__(self, form, field):
        code = field.data
        self.cur.execute("SELECT 1 FROM database WHERE project_code = '{}'".format(code))
        code_check = self.cur.fetchall()
        if not code_check:
            if self.message is None:
                self.message = field.gettext('Project code {} does not exists!'.format(code))
            raise StopValidation(self.message)

这里是 InputRequired 验证器的源代码供参考:

class InputRequired(object):
    field_flags = ('required', )

    def __init__(self, message=None):
        self.message = message


    def __call__(self, form, field):
        if not field.raw_data or not field.raw_data[0]:
            if self.message is None:
                message = field.gettext('This field is required.')
            else:
                message = self.message
                field.errors[:] = []
                raise StopValidation(message)

感谢您的帮助!

【问题讨论】:

  • 'required' 标志使用浏览器的 HTML5 功能来执行客户端验证(如果浏览器不支持 HTML5,则回退到服务器端验证)。在您的需求中,如果您想避免重新呈现 html,则需要添加 JavaScript 功能以通过 Ajax 执行存在性测试。我将wtforms-parsleyjs 用于此类任务。
  • 谢谢,我试试看。

标签: python validation flask flags wtforms


【解决方案1】:

让它与Parsley 一起工作,检查现有端点是否存在项目代码。

WTForm:

class ViewForm(FlaskForm):
    project_code = StringField('Project Code',
                                render_kw={'required':"", 'data-parsley-project-check':""})

JavaScript:

$(function () {
  Parsley.addValidator('projectCheck', {
    validateString: function(value) {
      console.log("validating")
      var send = {
          id: value,
      }
      var url = '/projects/'
      return $.getJSON(url, send, function(data) {
      }).then(function(json) {
        if (!json['features']) {
        return $.Deferred().reject()
      }
    })
    },
    messages: {
      en: 'Project code does not exist!'
    }
  })})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2017-06-07
    相关资源
    最近更新 更多