2011-12-09 7 views
1

HTMLFillを使用してフォームにデフォルト値を設定しようとしています。私は@view_configデコレータを使用し、makoでフォームを生成する関数を持っています。Pyramidの@view_configでHTMLFillを使用する

@view_config(renderer="templates/derived/new/model.mak", route_name='new_model_route') 
def new_model(self, fparams=None): 
    defaults = {'node_name': 'blah'} 
    process_route = route_url("process_model_route", self.request, ppath=ppath) 
    return dict({'ppath':ppath, 'process_route':process_route}) 

テンプレート:

<%def name="direct_load_model_form(method, target_path)"> 
${h.tags.form(method, multipart=True, method='post', hidden_fields=[('ppath', ppath)])} 
<b>Node Name: </b>${h.tags.text('node_name')}<BR> 
<b>Parameters: </b>${h.tags.file('params_file')}<BR> 
${h.tags.submit('submit', 'Submit')} 
${h.tags.end_form()} 
</%def> 
${self.direct_load_model_form(process_route, ppath)} 

基本的な使用例は次のようになります。

>>> from formencode import htmlfill 
>>> form = '<input type="text" name="fname">' 
>>> defaults = {'fname': 'Joe'} 
>>> htmlfill.render(form, defaults) 
'<input type="text" name="fname" value="Joe">' 

私は私の場合にはhtmlfill.renderの最初の引数を移入する方法を使用していないです。

答えて

2

form.makoのような別のmakoファイルにフォームを配置することができます。そこから文字列にレンダリングし、htmlfillに渡して結果を実際のテンプレートに渡すことができます。

<!-- new_model_form.mako --> 
<form ...> 
</form> 
from pyramid.renderers import render 

@view_config(..., renderer="new_model.mako") 
def new_model(self): 
    raw_form_html = render('new_model_form.mako', request, {...}) 
    form_html = htmlfill(raw_form_html, ...) 
    return { 
     'form_html': form_html, 
    } 
<!-- new_model.mako --> 
<% inherit file='base.mako' %> 

${form_html | n} 

あなたはエスケープされてレンダリングされたHTMLを避けるためにnフィルタを介してform_htmlをフィルタリングする必要があります。

もちろん、すべてのテンプレートを同じテンプレートに入れてレンダリングして、Responseオブジェクトをビューから返し、レンダラーをバイパスすることもできます。

from pyramid.renderers import render 

@view_config(...) # no renderer needed 
def new_model(self): 
    raw_html = render('new_model.mako', request, {...}) 
    html = htmlfill(raw_html, ...) 
    resp = request.response 
    resp.body = html 
    return resp 
関連する問題