首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WTForm FormField填充值

WTForm FormField填充值
EN

Stack Overflow用户
提问于 2016-03-02 14:27:47
回答 2查看 3.3K关注 0票数 2

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

models.py

类RepairCategory(db.Model):name =.类修复(db.Model):价格= .category_id FK =.product_id FK类产品(db.Model):名称=.描述= ..。颜色= ..。

ProductBase只包含与Product模型匹配的属性。

forms.py

代码语言:javascript
复制
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,这样就可以自动填充默认值。我也想使用form.populate_obj(),就在base_product表单上。

下面是如何在视图中创建Product:

代码语言:javascript
复制
def make_product_form(form=None, product=None, **kwargs):
    form = form()
    form.base_product.obj = product        
    return form

然后,在处理帖子时,我想做的是:

代码语言:javascript
复制
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不会被现有对象的默认值填充。

对于如何做到这一点,有什么建议吗?谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 21:47:11

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

关键是当我创建主产品表单(在make_product_form()中)时

form.base_product.obj我并不真正访问obj属性。

然而,做form.base_product.form.process(obj=product)确实有好处!关键是使用base_product.form来访问FormField中的表单。以下是form.base_product的所有属性。dir()是在form=form()中的make_product_form()之后计算的:

代码语言:javascript
复制
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是一个字段,而不是一个表单,而执行form.base_product.form使我得到了ProductBase表单。

希望这是有帮助的

**更新**

我只能在GET请求上使用进程(obj=product),预先填充表单,否则在POST上,实际的表单数据就会被丢弃。

票数 0
EN

Stack Overflow用户

发布于 2016-03-02 16:36:08

使用表单process方法使用对象的属性值填充表单字段。

使用表单populate_obj方法使用表单字段中的值填充对象的属性。

注意:对象属性的名称必须与表单字段匹配。

process示例:

代码语言:javascript
复制
>>> class MyObj(object):
...     name = "object's name"
>>> from wtforms import Form, StringField
>>> class MyForm(Form):
...     name = StringField("Form's name")
>>> my_obj = MyObj()
>>> my_obj.name
"object's name"
>>> my_form = MyForm()
>>> print my_form.name.data
None
>>> my_form.process(obj=my_obj)
>>> my_form.name.data
"object's name"

populate_obj示例:

代码语言:javascript
复制
>>> my_form.name.data = "Form's name"
>>> my_form.name.data
"Form's name"
>>> my_obj.name
"object's name"
>>> my_form.populate_obj(my_obj)
>>> my_obj.name
"Form's name"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35749962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档