【问题标题】:Using HTMLFill with Pyramid's @view_config将 HTMLFill 与 Pyramid 的 @view_config 一起使用
【发布时间】:2012-01-17 02:28:43
【问题描述】:

我正在尝试使用 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 的第一个参数。

【问题讨论】:

    标签: python forms pyramid mako htmlfill


    【解决方案1】:

    您可以将表单放在单独的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2012-04-02
      • 1970-01-01
      • 2011-06-30
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多