程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何很好地构建具有重复元素的表单

发布于2019-10-14 21:16     阅读(496)     评论(0)     点赞(3)     收藏(1)


标题确实没有说出来,因为我在总结问题时遇到了麻烦。因此,这里进行详细说明:

假设我要添加多个联系人的信息,并且我具有以下字段:

  • 联系人姓名
  • 联系方式(电子邮件,电话号码,即时消息)
    • 如果是电子邮件:显示一个电子邮件字段(假设此字段存在)
    • 如果是电话号码:显示电话号码字段
    • 如果是即时消息:显示文本字段

因此,马上,我将需要JavaScript在页面本身上完成此操作(添加添加或删除联系人字段),我可以接受。但是,由于我可以添加多个联系人(并且作为软件开发人员,我不知道用户要添加多少个联系人,所以可能是1、10或100)

因此,我最大的问题是我该如何构造每个字段的名称之类的内容。我应该将所有内容都放进诸如之类的东西中names[]contactmethods[]并按顺序进行访问,还是有更好的解决方案。

另外,如果服务器开始验证这些信息,并找到一些格式错误的信息,我希望能够将客户端发送到服务器的数据发送回客户端,这样他们就不会丢失自己拥有的所有信息。输入。我将如何轻松地做到这一点?

一些背景信息:当前正在使用的技术(相关):

  • 烧瓶
  • jQuery的
  • WTForms

解决方案


不需要构建任何东西(至少在服务器端)-WTForms已经支持您所需要的东西-称它们为“现场附件”您正在寻找的行为位于wtforms.fields.FormFieldwtforms.fields.FieldList

class ContactForm(Form):
    name = TextField("Name", validators=[Required()])
    contact_type = SelectField("Contact Type",
                                validators=[Required()],
                                choices=[
                                    ("email", "Email"),
                                    ("phone", "Phone Number"),
                                    ("im", "Instant Message")
                                ])
    # `If` is a custom validator - see below
    email_address = TextField("Email",
                                  validators=[If("contact_type",
                                                     "email",
                                                     [Required(), Email()])
                                  ])
    phone_number = TextField("Phone #",
                                  validators=[If("contact_type",
                                                           "phone", [Required()])
                                  ])
    im_handle = TextField("IM Handle",
                                  validators=[If("contact_type",
                                                           "im", [Required()])
                                  ])


class SignUpForm(Form):
    # Other fields go here
    contacts = FieldList(FormField(ContactForm))

根据用户的选择,您还需要一个自定义验证器来验证适当的字段:

# CAUTION: Untested code ahead
class If(object):
    def __init__(self,
                      parent,
                      run_validation=None,
                      extra_validators=None,
                      msg=None):
        self.parent = parent
        self.msg = msg if msg is not None else u"Invalid"
        if callable(run_validation):
            self.run_validation = run_validation
        else:
            _run_validation = lambda self, parent, form: parent.data == run_validation
            self.run_validation = _run_validation
        self.extra_validators = extra_validators if extra_validators is not None \
                                                     else []

    def __call__(self, field, form):
        parent = getattr(form, self.parent)
        if self.run_validation(parent, form):
            return field.validate(form, extra_validators=self.extra_validators)

当您form.validate()在服务器端调用时,将根据要求自动检查字段,并且将适当填充错误,因此您可以将其重新呈现给客户端。

在客户端创建新字段很简单,只要您命名并使用与它相同的命名约定 - ,WTForms就会在后端提取它们field.short_name + '-' + index



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/136842/3a9f04f3fa7f3c26815b/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)