1

HTMLFill を使用してフォームにデフォルト値を入力しようとしています。@view_config デコレータを使用し、mako でフォームを生成する関数があります。

@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

4

1 に答える 1

2

のように別の mako ファイルにフォームを配置できますform.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}

nレンダリングされた html がエスケープされないようにするには、フィルターを使用して 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
于 2011-12-09T22:38:49.563 に答える