2011-12-09 40 views
1

我想使用HTMLFill填充窗體的默認值。我有一個使用@view_config修飾器並在mako中生成表單的函數。使用HTMLFill與金字塔的@view_config

@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

您可以將表單放置在一個單獨的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