2016-08-19 73 views
2

我在我的金字塔應用程序中使用wtforms_sqlalchemy並定義幾個QuerySelectField s。查詢工廠使用導入的DBSession對象進行查詢。使用WTForms QuerySelectField與金字塔1.7的數據庫會話

from wtforms.form import Form 
from wtforms_sqlalchemy.fields import QuerySelectField 
from myapp.models import DBSession, MyModel 

def mymodel_choices(): 
    choices = DBSession.query(MyModel) 
    return choices 

class MyForm(Form): 
    mymod = QuerySelectField(u'Field', query_factory=mymodel_choices) 

金字塔1.7引入了一個新的SQLAlchemy scaffold,它將db會話對象附加到每個請求。使用新的腳手架mymodel_choices必須使用我的視圖中的request來訪問數據庫會話。該字段雖然不具有對請求對象的訪問權限,但不知道用它來調用工廠。

我的想法是直接從視圖更新query_factory,但這似乎不是一個合理的方式來做到這一點。當db會話是請求對象的一部分時,我怎樣才能使用QuerySelectField

回答

1

query_factory只規定默認查詢使用,但QuerySelectField will prefer the query property if it is set.這對金字塔很有用,它不鼓勵直接與threadlocal交互。

更改工廠以接受數據庫會話。將query設置爲使用請求的db會話調用工廠的結果。

def mymodel_choices(session): 
    return session.query(MyModel) 

f = MyForm(request.POST) 
f.mymod.query = mymodel_choices(request.db_session) 

由於這是一個有點不方便,你可以創建Form一個子類,是以request,翻出相應的表格數據,並調用每個QuerySelectField's查詢工廠的請求。

class PyramidForm(Form): 
    def __init__(self, request, **kwargs): 
     if 'formdata' not in kwargs and request.method == 'POST': 
      kwargs['formdata'] = request.POST 

     super().__init__(**kwargs) 

     for field in self: 
      if isinstance(field, QuerySelectField) and field.query_factory is not None and field.query is None: 
       field.query = field.query_factory(request.db_session) 

class MyForm(PyramidForm): 
    ... 

f = MyForm(request) 
+1

使用python2,super()方法不像這樣寫,使用** super(Form,self).__ init __(** kwargs)** –

+0

@ JérômePigeot自然就是這樣,只是大衛主義認爲你沒有使用過時的Python版本;) –

1

你可以嘗試這樣的事情(雖然它不是最乾淨的解決方案)

from myapp.models import MyModel 
from pyramid import threadlocal 

def mymodel_choices(request=None): 
    request = request or threadlocal.get_current_request() 
    choices = request.DBSession.query(MyModel) 
    return choices 

的更多詳細信息,請參閱:​​

+0

我已經檢查過這個優先級,但文檔說這是一種避免的可能性,用戶應該只是用它來進行測試。無論如何謝謝 –

+0

@JérômePigeot我相信wtforms並不是真正爲此設計的。 –

+0

@AnttiHaapala如果是這樣的話,這聽起來像是我的設計失敗。我正在使用wtforms,但幾乎所有的表單庫都需要相同的需求。我會繼續使用鍊金術的腳手架:)謝謝 –