2016-03-02 34 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),那麼你的建議就可以工作。我設法自己解決了這個問題 –