gpt4 book ai didi

sqlalchemy - 带有 SQLAlchemy 模型的 WTForms 中的唯一验证器

转载 作者:行者123 更新时间:2023-12-03 23:28:59 25 4
gpt4 key购买 nike

我在使用 SQLALchemy 管理数据库操作的应用程序中定义了一些 WTForms 表单。

例如,用于管理类别的表单:

class CategoryForm(Form):
name = TextField(u'name', [validators.Required()])

这是相应的 SQLAlchemy 模型:
class Category(Base):
__tablename__= 'category'
id = Column(Integer, primary_key=True)
name = Column(Unicode(255))

def __repr__(self):
return '<Category %i>'% self.id

def __unicode__(self):
return self.name

我想添加一个 唯一约束 在表单验证上(而不是在模型本身上)。

阅读 WTForms documentation ,我找到了一种使用简单类的方法:
class Unique(object):
""" validator that checks field uniqueness """
def __init__(self, model, field, message=None):
self.model = model
self.field = field
if not message:
message = u'this element already exists'
self.message = message

def __call__(self, form, field):
check = self.model.query.filter(self.field == field.data).first()
if check:
raise ValidationError(self.message)

现在我可以将该验证器添加到 分类表格像这样:
name = TextField(u'name', [validators.Required(), Unique(Category, Category.name)])

当用户尝试添加已存在的类别时,此检查效果很好\o/
但是 当用户尝试 时它不起作用更新现有类别 (不更改名称属性)。

当您想更新现有类别时:您将使用类别属性实例化表单以进行编辑:
def category_update(category_id):
""" update the given category """
category = Category.query.get(category_id)
form = CategoryForm(request.form, category)

主要问题是我不知道如何访问验证器中现有的类别对象,这会让我从查询中排除编辑过的对象。

有没有办法做到这一点?谢谢。

最佳答案

在验证阶段,您将可以访问所有字段。所以这里的技巧是将主键传递到您的编辑表单中,例如

class CategoryEditForm(CategoryForm):
id = IntegerField(widget=HiddenInput())

然后,在唯一验证器中,将 if 条件更改为:
check = self.model.query.filter(self.field == field.data).first()
if 'id' in form:
id = form.id.data
else:
id = None
if check and (id is None or id != check.id):

关于sqlalchemy - 带有 SQLAlchemy 模型的 WTForms 中的唯一验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5685831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com