我正在尝试使用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
的第一个参数。
答案 0 :(得分: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
过滤器过滤form_html,以避免呈现的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