【问题标题】:How do you specify unique=True for WTForms-Alchemy?如何为 WTForms-Alchemy 指定 unique=True?
【发布时间】:2017-10-08 04:06:48
【问题描述】:

我有以下课程:

class Cloaker(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  domain = db.Column(db.String(32), unique=True, nullable=False, info={
    'description': 'Raw Domain Only (no www). i.e. hello.com',
    'validators': raw_domain_validator,
  })

(注意域的 unique=True

使用 WTForm 生成的表单:

class CloakerForm(ModelForm):
  class Meta:
    model = Cloaker

我有以下代码来处理这个模型的 CRUD:

@cloaker_bp.route('/new/', methods=['GET', 'POST'])
@cloaker_bp.route('/<cloaker_id>/', methods=['GET', 'POST'])
def cloaker(cloaker_id=None):
  cloaker = Cloaker.query.get(cloaker_id) if cloaker_id else Cloaker()
  if request.method == 'GET':
    form = CloakerForm(obj=cloaker)
    form.populate_obj(cloaker)
  else:
    form = CloakerForm(request.form)
    if form.validate():
      form.populate_obj(cloaker)
      db.session.add(cloaker)
      db.session.commit()
      return redirect(url_for('.list_cloakers'))

  return render_template('cloaker/single.html', form=form, cloaker=cloaker)

当我更新一个对象时,我总是收到Already exists. 的域。

当我在 wtforms-alchemy 的网站上关注 Using unique validator with existing objects 时:

  ...(from the CRUD view)... 
  else:
    form = CloakerForm(obj=cloaker)
    #form = CloakerForm(request.form)
    form.populate_obj(cloaker)
    if form.validate():
      db.session.add(cloaker)
      db.session.commit()

我收到This field is required. 的域名。如果我遵循他们的建议,我不明白 WTForms-Alchemy 如何从 request.form 获取他们的数据。

如何让 unique=True 处理我的视图?

【问题讨论】:

    标签: python flask sqlalchemy wtforms


    【解决方案1】:

    在 POST/UPDATE 上也存在“已经存在”的问题。但doc's solution 确实对我有帮助:

    obj = MyModel.query.get(1) form = MyForm(obj=obj) form.populate_obj(obj) form.validate()

    谢谢,因为这个问题帮助我找到了文档中的部分。

    【讨论】:

      【解决方案2】:

      使用 WTForms-Alchemy 版本 0.17.0 我发现如果我这样做了

       record = MyModel.query.filter(MyModel.id = <some valid number>).one()
      

      然后当request.method == 'POST'

       my_form = MyModelForm(request.form, obj=record)
       
      

      同时提供 request.formobj 参数可寻址唯一验证器并绕过必填字段,但仍允许更新。

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 1970-01-01
        • 2021-05-02
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多