Flask应用数据库更新后表单SelectField选项未实时刷新问题
根本原因
你遇到的问题是类属性计算时机导致的:
Python 在首次加载BilltextForm类定义时,就会执行类属性的赋值逻辑,也就是你写在SelectField的choices参数里的SelZahlungsart.get_selection_values(...)只会在应用启动、模块加载阶段执行一次,之后每次实例化表单都不会重新调用该方法,因此选择框的选项永远是应用启动时查询到的旧数据。
解决方法
核心思路是每次实例化表单时动态拉取最新数据赋值给choices,有两种常用实现方式:
方案1:在表单构造函数中动态赋值(推荐)
修改BilltextForm类,添加构造函数,在实例化阶段拉取最新选项:
class BilltextForm(FlaskForm): """ Form for admin to add/edit billextra """ ... # 定义字段时不指定choices zahlungsart = SelectField() submit = SubmitField('Speichern') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 每次实例化表单都重新查询最新的支付类型数据 self.zahlungsart.choices = SelZahlungsart.get_selection_values(SelZahlungsart, SelZahlungsart.zahlungsart)
方案2:在视图中实例化表单后手动赋值
如果不想修改表单类,也可以在视图逻辑中更新选项:
add_billtext = True form = BilltextForm() # 手动更新选择框选项 form.zahlungsart.choices = SelZahlungsart.get_selection_values(SelZahlungsart, SelZahlungsart.zahlungsart) if form.validate_on_submit(): billtext = TBilltext(..., zahlungsart=form.zahlungsart.data) return (add_dataset(billtext, "Neuer Rechnungstext erfolgreich hinzugefügt", "Fehler beim Hinzufügen des neuen Rechnungstextes!", "admin.list_billtexts"))
额外注意事项
WTForms的SelectField要求choices参数接收格式为[(存储值, 显示文本)]的二元组列表,如果你的get_selection_values当前返回的是单值列表,需要修改方法逻辑适配格式,示例:
@staticmethod def get_selection_values(q_object, q_field): result = [(r.field, r.field) for r in db.session.query(q_object).with_entities(q_field.label('field')).distinct()] return result
内容的提问来源于stack exchange,提问作者cojody
相关产品推荐
相关产品推荐

