WTForm FormField填充值

乔罗·特内夫(Joro Tenev)

我在WTForms中设置FieldForm的默认值时遇到问题。

models.py

class RepairCategory(db.Model):
    name = ...
class Repair(db.Model):
    price = ..
    category_id [FK] = ...
    product_id [FK]
class Product(db.Model):
    name = ...
    description = ...
    color = ...

ProductBase仅包含与Product db模型匹配的属性。
表格

class NewRepair(Form):
    #this is okay - it get's populated
    repair_category = QuerySelectField("Repair category",
                                       query_factory=get_categories)                     
    price = DecimalField()

class ProductBase(Form):
    name = StringField("Name ", validators=[DataRequired(), Length(1, 64)])
    color = StringField("Color ", validators=[DataRequired(), Length(1, 64)])
    description = TextAreaField("Description")
    active = BooleanField()

class Product(Form):
    base_product = FormField(ProductBase)
    add_repairs = FormField(NewRepair)
    submit = SubmitField('Submit')

add_repairs包含一个我想在视图中用于创建维修的表格。base_product是一种表单,理想情况下,我想在视图中传递obj = product,因此默认值会自动填充。我也想在base_product表单上使用form.populate_obj()。

这是我在视图中创建“产品”表单的方式:

def make_product_form(form=None, product=None, **kwargs):
    form = form()
    form.base_product.obj = product        
    return form

然后,在处理POST时,我想做:

def product(id):
    product = Product.query.get_or_404(id)

    form = make_product_form(form=Product,product=product)

    if form.validate_on_submit():
        product_form = form.base_product
        product_form.populate_obj(product)

但是,Product表单中的base_form不会被现有对象的默认值填充。

关于如何实现这一目标的任何建议?谢谢 :)

乔罗·特内夫(Joro Tenev)

发现可以直接在浏览器中的Flask堆栈跟踪中运行代码之后(这有多酷?),我找到了解决问题的方法。

关键是在创建主要产品表单(在make_product_form()中)时,我
form.base_product.obj实际上并没有真正访问obj属性。

但是,这样做form.base_product.form.process(obj=product)就可以了!关键是使用base_product。形成以获得访问FormField内的形式。这是form.base_product的所有属性。在make_product_form()中,仅在form = form()之后评估dir():

dir(form.base_product)
[#ommitted some attributes#, 
'__weakref__', '_formfield', '_obj', '_run_validation_chain', 
'_translations', 'data', 'default', 'description', 
'do_not_call_in_templates', 'errors', 'filters', 'flags', 'form',
'form_class', 'gettext', 'id', 'label', 'meta', 'name', 'ngettext', 
'object_data', 'populate_obj', 'post_validate', 'pre_validate', 
'process', 'process_data', 'process_errors', 'process_formdata', 
'raw_data', 'render_kw', 'separator', 'short_name', 'type', 
'validate', 'validators', 'widget' ]

这表明实际上form.base_product是一个Field,而不是Form,并且执行form.base_product.form使我获得了ProductBase表单。

希望这会有所帮助

**更新**
我只必须在GET请求上使用process(obj = product)来预先填充表单,否则在POST上,实际的表单数据将被丢弃。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

预填充Flask-WTForm IntegerField

来自分类Dev

预填充Flask-WTForm IntegerField

来自分类Dev

使用Flask-Principal角色填充WTForm MultiCheckboxField

来自分类Dev

Flask:使用带有关系的SQLalchemy模型填充WTform

来自分类Dev

使用Flask-Principal角色填充WTForm MultiCheckboxField

来自分类Dev

无法使用request.args正确填充WTForm

来自分类Dev

按模式填充值

来自分类Dev

PHP 从 MySQL 填充值

来自分类Dev

用选择填充值

来自分类Dev

(烧瓶)WTForm呈现了错误的值

来自分类Dev

未验证动态 WTForm 字段

来自分类Dev

GCC数组默认填充值

来自分类Dev

用填充值扩展矩阵

来自分类Dev

无法在Xpath中填充值

来自分类Dev

根据自动填充值填充下拉列表

来自分类Dev

未显示WTForm,取而代之的是python代码

来自分类Dev

烧瓶wtform RadioField标签不呈现

来自分类Dev

WTForm自定义内联验证器

来自分类Dev

根据单击的按钮验证WTForm表单

来自分类Dev

将值关联到wtform字段

来自分类Dev

使用 jQuery 清除 WTForm 中的某些字段

来自分类Dev

基于db的Flask-SQLAlchemy wtform

来自分类Dev

如何从烧瓶 wtform 获取时间间隔?

来自分类Dev

SQL在xml列表中填充值

来自分类Dev

Java RSA解密-摆脱填充值

来自分类Dev

R填充值取决于组合

来自分类Dev

在多维数组(PHP)中填充值

来自分类Dev

使用可选的地图来填充值

来自分类Dev

MySql根据其他表填充值