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

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

来自分类Dev

SQL在xml列表中填充值

来自分类Dev

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

来自分类Dev

预填充Flask-WTForm IntegerField

来自分类Dev

Java RSA解密-摆脱填充值

来自分类Dev

使用Flask-Principal角色填充WTForm MultiCheckboxField

来自分类Dev

烧瓶wtform RadioField标签不呈现

来自分类Dev

GCC数组默认填充值

来自分类Dev

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

来自分类Dev

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

来自分类Dev

R填充值取决于组合

来自分类Dev

使用可选的地图来填充值

来自分类Dev

WTForm自定义内联验证器

来自分类Dev

MySql根据其他表填充值

来自分类Dev

用填充值扩展矩阵

来自分类Dev

按模式填充值

来自分类Dev

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

来自分类Dev

无法在Xpath中填充值

来自分类Dev

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

来自分类Dev

将值关联到wtform字段

来自分类Dev

预填充Flask-WTForm IntegerField

来自分类Dev

使用Flask-Principal角色填充WTForm MultiCheckboxField

来自分类Dev

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

来自分类Dev

PHP 从 MySQL 填充值

来自分类Dev

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

来自分类Dev

未验证动态 WTForm 字段

来自分类Dev

基于db的Flask-SQLAlchemy wtform

来自分类Dev

用选择填充值

来自分类Dev

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