带UUID的FlaskWTF selectfield

2024-09-30 12:26:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用sqlalchemy并对数据库中的主键(postgres)使用UUID

这是我的课:

class EntityType(db.Model):
    __tablename__ = 'entity_type'

    id = db.Column(UUID(as_uuid=True), primary_key=True, server_default=db.text('gen_random_uuid()'))
    name = db.Column(db.Text, nullable=False)

在表单中添加一个实体,用户必须选择一个实体类型,我有以下几点

class EntityAddForm(FlaskForm):

    url = StringField('URL', validators=[DataRequired(),URL(require_tld=True)])
    entity_type = SelectField('Entity type')
    description = TextAreaField('Description')
    submit = SubmitField('Add')

    def validate_entity_type(self, entity_type):
        entity_type = EntityType.query.filter_by(id=entity_type.data).first()
        if entity_type is None:
            raise ValidationError('Please select a different entity type.')

要加载表单,我有以下代码用表中的行填充selectField。你知道吗

    form = EntityAddForm()
    form.entity_type.choices = [(et.id, et.name) for et in EntityType.query.order_by('name')]

问题是如果提交时验证表格():在提交时不返回True。你知道吗

似乎WTForms需要一个string/unicode/int,并对selectField的id使用强制

有没有办法继续使用UUID类型而不是切换到integer来让selectField工作?你知道吗

我尝试了QuerySelectEntity或自定义UUID类型,但未能成功。你知道吗

谢谢


Tags: nameidtrue表单类型dbuuidtype
1条回答
网友
1楼 · 发布于 2024-09-30 12:26:30

您是否尝试过将数据库转换为字符串以使其在web上运行良好:

def default_uuid():
    return uuid.uuid4().hex

class EntityType(db.Model):
    __tablename__ = 'entity_type'
    id = db.Column(db.String, primary_key=True, default=default_uuid)

在传递到web以在表单中使用时明确转换数据:

form.entity_type.choices = [(str(et.id), et.name) for et in EntityType.query.order_by('name')]

以及

def validate_entity_type(self, entity_type):
        entity_type = EntityType.query.filter_by(id=uuid.UUID(entity_type.data)).first()
        if entity_type is None:
            raise ValidationError('Please select a different entity type.')

相关问题 更多 >

    热门问题