2012-04-06 68 views
1

我有一種形式,看起來有點像這樣:WTForms:我似乎無法動態地給一個QuerySelectField默認值

class AddProductForm(Form): 
    title = TextField('Title') 
    type = QuerySelectField('Type', 
     query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all()) 

    def __init__(self, formdata=None, obj=None, prefix='', **kwargs): 
     try: 
      product_type_id = ProductType.query.filter_by(name=obj['product_type']).one().product_type_id 
      kwargs.setdefault('type', product_type_id) 
     except NoResultFound: 
      pass 

     Form.__init__(self, formdata, obj, prefix, **kwargs) 

正如你可以看到我試圖設置此給予加載表單時product_type的合理默認值。但是,雖然這種類型的代碼用於設置標題作爲示例,但它不適用於QuerySelectField「類型」。有沒有人有任何想法我可以解決這個問題?

假設這是不可能的,沒有任何人知道我怎麼能動態添加表單元素的形式?

+0

嗨,你是否同時解決了這個問題? – Ib33X 2013-01-24 13:42:40

回答

2

使用參數,如:

QuerySelectField(allow_blank=True, blank_text=u'-- please choose --', ...) 

可以添加默認選擇選項

+0

這正是我所需要的 – Anekdotin 2017-03-20 14:30:55

6

要WTForms的QuerySelectField定義的默認值,你可以在字段定義直接做到這一點:

my_field = QuerySelectField(
    label=u"My Label", 
    query_factory=lambda: Model.query(...), 
    get_pk=lambda item: item.id, 
    get_label=lambda item: item.name, 
    allow_blank=True, 
    default=lambda: Model.query.filter(...).one()) 

但是,它看起來不那麼簡單。考慮到這一點:

  • 默認值必須是調用
  • 此調用必須返回你的模型的對象實例(不是它的PK,但整個物體)
  • 它只會是如果使用不OBJFORMDATA用於初始化形式實例(在這兩種情況下,默認值被忽略)

在您的CA SE,因爲你是初始化使用,你不手頭有在初始化時您obj的屬性的默認值,你可以使用一個工廠來代替:

def add_product_form_factory(default_type_name): 
    class AddProductForm(Form): 
     title = TextField('Title') 
     type = QuerySelectField('Type', 
      query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all(), 
      default=ProductType.query.filter_by(name=default_type_name).one() 
     ) 
    return AddProductForm 

這裏有構成上述形式的函數根據參數(在這種情況下,您不需要默認爲可調用):

AddProductForm = add_product_form_factory(default_type_name='foo') 
form = AddProductForm() 

ps。表單工廠的好處在於,您可以動態地使用表單,在運行時創建字段或設置選項。

+0

感謝您指出這一點:「只有在沒有使用obj或formdata來初始化表單實例時纔會使用它(在這兩種情況下,默認值都會被忽略)」 – PartialOrder 2016-04-28 14:50:03