2016-03-02 70 views
0

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

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只包含属性,这些属性相匹配的产品型号分贝。
forms.py

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表单。

这里就是我如何在视图中创建的产品形式:

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

然后,处理职位时,我想做的事:

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) 

然而,从产品形式base_form,没有被填充来自现有对象的默认值。

有关如何实现此目的的任何建议? 谢谢:)

+1

您的'make_product_form'函数不会抛出'AttributeError'异常吗?在ProductBase类中没有'obj'属性,所以'form.base_product.obj = product'行不能运行。您也没有发布“EditProduct”类的代码。 – kchomski

回答

0

发现,你可以直接从烧瓶中的堆栈跟踪在浏览器中运行的代码(?这太酷了)后,我发现解决我的问题。

的关键是创造的主要产品形式时(在make_product_form()),当我做
form.base_product.obj我真的不访问obj的属性。

但是,在做form.base_product.form.process(obj=product)做到了!关键是使用base_product。 表格为了访问FormField中的表单。 这里是form.base_product的所有attribututes。该目录()只是形式=形式()之后在make_product_form()评估:

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' ] 

什么这说明的是,实际上形成。base_product是一个字段,而不是一个表单,并做form.base_product.form让我产品库表格。

希望这是有益

**更新 **
我不得不使用过程中(OBJ =产品)只对GET请求,以预填充表单,否则在POST,实际的表单数据被丢弃。

0

使用表格process方法来填充对象的属性值的表单字段。
使用表格populate_obj方法使用表单字段中的值填充对象的属性。
注意:对象属性的名称必须与表单字段的名称匹配。

process例如:

>>> 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例如:

>>> 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" 
+0

非常感谢回复! :)如果我有权访问表单(如form.base_form),那么你的建议就可以工作。我设法自己解决了这个问题 –